variable una script pasar parametros funciones example entorno crear con bash shell scripting hidden-features

una - variables de entorno linux bash



Características ocultas de Bash (30)

Combinaciones de teclas mágicas de las páginas de bash man :

  • Ctrl + a y Ctrl + e mueven el cursor al principio y al final de la línea actual, respectivamente.

  • Ctrl + t y Alt + t transponen el carácter y la palabra antes del cursor con el actual, luego mueven el cursor hacia adelante.

  • Alt + u y Alt + l convierten la palabra actual (del cursor al final) a mayúsculas y minúsculas.

    Sugerencia: presione Alt + - seguido de cualquiera de estos comandos para convertir el comienzo de la palabra actual.


Consejos para man bonificación:

  • Mientras visualiza páginas man , use / para buscar texto dentro de las páginas. Usa n para avanzar al siguiente partido o N para el partido anterior.

  • Agilice su búsqueda de un comando o subsección particular dentro de las páginas man aprovechando su formato:

    o En lugar de escribir / expansión de historial para encontrar esa sección, intente con / ^ history , utilizando el símbolo de intercalación ( ^ ) para buscar solo las líneas que comiencen por "history".

    o Pruebe / lea , con algunos espacios iniciales, para buscar ese comando incorporado. Los builtins siempre están sangrados en las páginas man .

Los scripts de shell a menudo se utilizan como pegamento para la automatización y tareas simples únicas. ¿Cuáles son algunas de sus características "ocultas" favoritas del lenguaje Bash shell / scripting?

  • Una característica por respuesta
  • Dé un ejemplo y una breve descripción de la característica, no solo un enlace a la documentación
  • Etiquete la función usando el título en negrita como primera línea

Ver también:


Más combinaciones de teclas mágicas:

  • Ctrl + r inicia una "búsqueda incremental inversa" a través de su historial de comandos. A medida que continúa escribiendo, recupera el comando más reciente que contiene todo el texto que ingresa.

  • Tab completa la palabra que ha tipeado hasta ahora si no es ambigua.

  • Tab Tab enumera todas las terminaciones de la palabra que ha tipeado hasta ahora.

  • Alt + * inserta todas las terminaciones posibles, lo que es particularmente útil, por ejemplo, si acabas de ingresar un comando potencialmente destructivo con comodines:

    rm -r source/d*.c Alt + *
    rm -r source/delete_me.c source/do_not_delete_me.c

  • Ctrl + Alt + e realiza el alias, el historial y la expansión del shell en la línea actual. En otras palabras, la línea actual se vuelve a mostrar ya que será procesada por el shell:

    ls $HOME/tmp Ctrl Alt + e
    ls -N --color=tty -T 0 /home/cramey


Deshacer

CS-- Control Shift Minus Deshace acciones de tipeo.

Matar / Yank

Cualquier operación de eliminación Cw (eliminar la palabra anterior), Ck (eliminar al final de la línea), Cu (eliminar al inicio de la línea), etc ... copia su texto eliminado en el anillo de la muerte, puede pegar la última muerte con: Cy y recorrer (y pegar) el anillo de elementos eliminados con Alt-y


Ampliación de abrazadera

Expansión estándar con {x, y, z}:

$ echo foo{bar,baz,blam} foobar foobaz fooblam $ cp program.py{,.bak} # very useful with cp and mv

Expansión de la secuencia con {x..y}:

$ echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z $ echo {a..f}{0..3} a0 a1 a2 a3 b0 b1 b2 b3 c0 c1 c2 c3 d0 d1 d2 d3 e0 e1 e2 e3 f0 f1 f2 f3


Aquí dos de mis favoritos:

Para verificar la sintaxis sin ejecutar realmente el script, use:

bash -n script.sh

Regrese al último directorio (sí, sé pushd y popd, pero esto es más rápido)

cd -


Aquí está uno de mis favoritos. Esto establece que la finalización de la pestaña no sea sensible a mayúsculas y minúsculas Es realmente genial para escribir rápidamente rutas de directorio, especialmente en una Mac donde el sistema de archivos no distingue entre mayúsculas y minúsculas por defecto. Puse esto en .inputrc en mi carpeta de inicio.

set completion-ignore-case on


Arrays:

#!/bin/bash array[0]="a string" array[1]="a string with spaces and /"quotation/" marks in it" array[2]="a string with spaces, /"quotation marks/" and (parenthesis) in it" echo "There are ${#array[*]} elements in the array." for n in "${array[@]}"; do echo "element = >>${n}<<" done

Se pueden encontrar más detalles sobre las matrices (y otras cosas avanzadas de scripts de bash) en la Guía avanzada de scripts Bash .


Casi todo lo que figura en la sección EXPANSIÓN en el manual

En particular, la expansión de parámetros:

$ I=foobar $ echo ${I/oo/aa} #replacement faabar $ echo ${I:1:2} #substring oo $ echo ${I%bar} #trailing substitution foo $ echo ${I#foo} #leading substitution bar


Corrección rápida y sucia de los errores tipográficos (especialmente útil para comandos largos sobre conexiones lentas donde usar el historial de comandos y desplazarse a través de ellos sería horrible):

$ cat /proc/cupinfo cat: /proc/cupinfo: No such file or directory $ ^cup^cpu

Pruebe también !:s/old/new que sustituya antigua con nueva en el comando anterior una vez.

Si desea sustituir muchas veces, puede hacer una sustitución global con !:gs/old/new .

Puede usar los comandos gs con cualquier evento de historial, por ejemplo

!-2:s/old/new

Para sustituir old por new (una vez) en el penúltimo comando.


Estas propiedades son otra de mis favoritas.

export HISTCONTROL=erasedups export HISTSIZE=1000

El primero se asegura de que bash no registre comandos más de una vez, realmente mejorará la utilidad de la history . El otro amplía el tamaño del historial a 1000 desde el valor predeterminado de 100. De hecho, configuro esto a 10000 en mis máquinas.


Expresiones numéricas de estilo C:

let x="RANDOM%2**8" echo -n "$x = 0b" for ((i=8; i>=0; i--)); do let n="2**i" if (( (x&n) == n )); then echo -n "1" else echo -n "0" fi done echo ""


La variable especial al azar:

if [[ $(($RANDOM % 6)) = 0 ]] then echo "BANG" else echo "Try again" fi


Me gusta la función -x, lo que permite ver lo que está sucediendo en su secuencia de comandos.

bash -x script.sh


Mi favorito:

sudo !!

Vuelva a ejecutar el comando anterior con sudo.


No es realmente una característica, sino más bien una dirección: encontré muchas "funciones ocultas", secretos y varias utilidades bash en commandlinefu.com . Muchas de las respuestas mejor calificadas a estas respuestas, las aprendí en ese sitio :)


Otra pequeña: Alt + #

comenta la línea actual y la mueve al búfer de historial.

Entonces cuando estás armando una línea de comando y necesitas emitir un comando interino para, por ejemplo, encontrar un archivo, solo presiona alt + #, emite el otro comando, sube en el historial, descomenta y continúa.


Puede ignorar ciertos archivos mientras se completa la tabulación configurando la variable FIGNORE .

Por ejemplo, si tiene un repositorio de subversión y desea navegar más fácilmente, haga

export FIGNORE=".svn"

ahora puede hacer un cd sin ser bloqueado por los directorios .svn .


Recientemente leí Csh Programming Considered Harmful, que contenía esta asombrosa gema:

Considere la tubería:

A | B | C

Desea saber el estado de C, bueno, eso es fácil: está en $ ?, o $ estado en csh. Pero si lo quieres de A, no tienes suerte, si estás en el csh, eso es. En el shell Bourne, puedes obtenerlo, aunque hacerlo es un poco complicado. Aquí hay algo que tenía que hacer donde ejecutaba la herramienta stdr de dd en una tubería grep -v para eliminar el ruido de entrada / salida de registros, pero tenía que devolver el estado de salida de la unidad de disco, no la de grep:

device=/dev/rmt8 dd_noise=''^[0-9]+/+[0-9]+ records (in|out)$'' exec 3>&1 status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1` exit $status;


Usando aritmética:

if [[ $((2+1)) = $((1+2)) ]] then echo "still ok" fi


SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"

SEGUNDOS

Cada vez que se hace referencia a este parámetro, la cantidad de segundos desde que se devuelve la invocación del shell. Si se asigna un valor a SECONDS, el valor devuelto en referencias posteriores es el número de segundos desde la asignación más el valor asignado. Si SECONDS no está configurado, pierde sus propiedades especiales, incluso si se restablece posteriormente.


export TMOUT=$((15*60))

Termine bash después de 15 minutos de tiempo de inactividad, configúrelo en 0 para deshabilitarlo. Normalmente pongo esto en ~ / .bashrc en mis cuentas de root. Es útil cuando administra sus cajas y puede olvidarse de cerrar la sesión antes de retirarse de la terminal.


Ctrl x Ctrl e

Esto cargará el comando actual en el editor definido en la variable VISUAL. Esto es realmente útil para comandos largos como algunos de los enumerados aquí.

Para usar vi como su editor:

export VISUAL=vi


Ejecutando un comando antes de mostrar el indicador bash

Establezca un comando en la variable de env "PROMPT_COMMAND" y se ejecutará automáticamente antes de cada solicitud. Ejemplo:

[lsc@home]$ export PROMPT_COMMAND="date" Fri Jun 5 15:19:18 BST 2009 [lsc@home]$ ls file_a file_b file_c Fri Jun 5 15:19:19 BST 2009 [lsc@home]$ ls

Para los próximos tontos de abril, agregue "export PROMPT_COMMAND = cd" a la .bashrc de alguien, luego siéntese y observe cómo se desarrolla la confusión.


Manejo de expresiones regulares

Los lanzamientos recientes de bash presentan coincidencias de expresiones regulares, por lo que puedes hacer:

if [[ "mystring" =~ REGEX ]] ; then echo match fi

donde REGEX es una expresión regular sin procesar en el formato descrito por man re_format.

Las coincidencias de cualquier parte entre corchetes se almacenan en la matriz BASH_REMATCH, comenzando en el elemento 1 (el elemento 0 es la cadena combinada en su totalidad), por lo que puede usar esto para realizar un análisis sintáctico con potencia regex.


Regresar los comandos y argumentos de historial

Es posible acceder de manera selectiva a los comandos y argumentos anteriores usando ! operador. Es muy útil cuando trabajas con rutas largas.

Puede verificar sus últimos comandos con history .

Puede usar comandos previos con !<n> siendo n el índice del comando en el history , los números negativos cuentan hacia atrás desde el último comando en el historial.

ls -l foo bar touch foo bar !-2

Puede usar argumentos anteriores con !:<n> , cero es el comando,> = 1 son los argumentos.

ls -l foo touch !:2 cp !:1 bar

Y puedes combinar ambos con !<n>:<m>

touch foo bar ls -l !:1 !:2 rm !-2:1 !-2:2 !-2

¡También puede usar rangos de argumentos !<n>:<x>-<y>

touch boo far ls -l !:1-2

Otro ! modificadores especiales son:

  • * para todos los argumentos

    ls -l foo bar ls !*

  • ^ para el primer argumento ( !:1 == !^ )

  • $ para el último argumento

    ls -l foo bar cat !$ > /dev/null


Si desea mantener un proceso en ejecución después de cerrar la sesión:

disown -h <pid>

es un bash útil incorporado. A diferencia de nohup , puede ejecutar disown en un proceso que ya se está ejecutando.

Primero, detenga su trabajo con control-Z, obtenga el pid de ps (o use echo $! ), bg para enviarlo al fondo, y luego use disown con el indicador -h.

No te olvides de hacer un fondo de tu trabajo o se perderá cuando finalices la sesión.


Tirantes en lugar de do y done en for loop

For cuerpo del bucle usualmente están en do...done (solo un ejemplo):

for f in *; do ls "$f"; done

Pero podemos usar un estilo C usando llaves:

for f in *; { ls "$f"; }

Creo que esto se ve mejor que do...done y prefiero este. Todavía no he encontrado esto en ninguna documentación de Bash, así que esta es realmente una función oculta.


Truncar el contenido de un archivo (archivo de puesta a cero)

> file

Específicamente, esto es muy bueno para truncar archivos de registro, cuando el archivo está abierto por otro proceso, que aún puede escribir en el archivo.


Uso de operadores Booleanos Infix

Considere el simple si:

if [ 2 -lt 3 ] then echo "Numbers are still good!" fi

Eso - se ve un poco feo. No muy moderno. Si usa corchetes dobles alrededor de su expresión booleana, puede usar los operadores booleanos normales.

if [[ 2 < 3 ]] then echo "Numbers are still good!" fi


insertar el parámetro final de la línea anterior

alt - . la combinación de teclas más útil, pruebe y vea, por alguna razón, nadie sabe acerca de esta.

presione una y otra vez para seleccionar los últimos parámetros anteriores.

genial cuando quieres hacer algo diferente a algo que usaste hace un momento.