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:
- Funciones ocultas de C
- Funciones ocultas de C #
- Funciones ocultas de C ++
- Características ocultas de Delphi
- Funciones ocultas de Python
- Funciones ocultas de Java
- Funciones ocultas de JavaScript
- Características ocultas de Ruby
- Funciones ocultas de PHP
- Características ocultas de Perl
- Funciones ocultas de VB.Net
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 argumentosls -l foo bar ls !*
^
para el primer argumento (!:1
==!^
)$
para el último argumentols -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.