GNU/Linux >> Tutoriales Linux >  >> Linux

Comandos Bash Bang:un truco imprescindible para la línea de comandos de Linux

Olvídese nunca de ejecutar sudo ante un comando? ¿Alguna vez tuviste que repetir un comando completo porque tenías un error tipográfico? ¿Alguna vez pensó que sería bueno tener accesos directos para repetir sus comandos anteriores? Si esto suena como usted, tengo algo para compartir. En este artículo, te mostraré cómo usar bash bang (! ), que facilitan la repetición de comandos y la corrección de errores.

Aspectos básicos de la repetición de comandos

Bash brinda acceso a la lista de comandos que emitió anteriormente, que se conoce como su historial de comandos. El valor de HISTSIZE variable establece el número de comandos que se guardan en su lista de historial. De forma predeterminada, este valor es 500. Estos comandos emitidos anteriormente (conocidos como su lista de historial) se almacenan en su archivo de historial. Su ubicación predeterminada es ~/.bash_history , y esta ubicación se almacena en la variable de shell HISTFILE .

Debajo del capó, los comandos bang (!) introducen comandos de su lista de historial de bash en el flujo de entrada. Esta función facilita la repetición de comandos, la sustitución de texto, la manipulación de argumentos y la corrección rápida de errores tipográficos en los comandos anteriores.

Ejemplos de repetición de comandos

Estos son algunos ejemplos de lo que puede hacer con bash bang.

Repite el último comando que coincida con el comienzo de una cadena

La explosión (! ) seguido del primer carácter (o cadena) que coincida con el comando que desea ejecutar repetirá la instancia más reciente de ese comando:

$ ls
dir  dir1  dir2  file  file1  file2  hello.txt

$ !l
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

$ !ls
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

Repite el último comando que coincida en cualquier parte de una cadena

El !?<string> format hace lo mismo que el anterior, pero <string> no tiene que estar al principio del comando:

$ cat hello.txt 
Hello world ..!
$ !?hello.txt
cat hello.txt 
Hello world ..!

Repite el comando n de tu historial

Repetir el comando n de su historial de bash (contando desde arriba) es tan simple como usar un golpe con el número en cuestión:

!10

Repite el n-ésimo comando de tu última entrada en el historial

Repetir el comando n de su historial de bash (contando desde abajo) es tan simple como usar una explosión con un signo menos y el número en cuestión:

!-10

Repetir el último comando

Si hay un comando bang que uso todo el tiempo, sería !! . El bang-bang (!! ) repite el último comando de la lista de historial, comportándose igual que !-1 :

$ cat hello.txt 
Hello world ..!
$ !!
cat hello.txt 
Hello world ..!

Bang-bang (!! ) es útil cuando necesita repetir el comando anterior, o si necesita el prefijo sudo , o tubería de salida:

$ yum update
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
$ sudo !!
sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
$ ls
dir  dir1  dir2  file  file1  file2  hello.txt
$ !! | grep file
ls | grep file
file
file1
file2
$ 

Repetir pero sustituir una cadena

A menudo emito comandos largos y los vuelvo a emitir con diferentes interruptores. O bien, necesito volver a emitir un comando porque hubo un error tipográfico en mi comando anterior. La sustitución de cadenas me permite hacer esto sin volver a escribir todo el comando largo.

Hay dos formas en que podemos lograr este resultado. Una es usando:

!!:s^<old>^<new>

Esta estructura sustituye una cadena por el comando anterior:

$ ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf
$ !!:s^conf.d^conf
ls /etc/httpd/conf
httpd.conf  magic

Incluso puedes hacer lo mismo con !<string>:s^<old>^<new> :

$ !l:s^conf^conf.d
ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf

Esta opción es útil cuando necesita hacer una sustitución de cadenas para un comando que no era el más reciente.

La otra forma en que podemos lograr este resultado es a través de la estructura ^<old>^<new> . Este formato sustituye cadenas por el comando más reciente, similar a !!:s^<old>^<new> :

$ cd /etc/httpd/conf.d
/etc/httpd/conf.d 
/etc/httpd/conf.d $ ^conf.d^conf
cd /etc/httpd/conf
/etc/httpd/conf $ 

Repetir argumentos de comando

A menudo, usamos los mismos argumentos de un comando anterior. Si tiene un argumento largo, probablemente quiera repetirlo con el siguiente comando. Veamos algunos comandos bash bang que pueden hacer esto por nosotros.

Primero, el formato !:n repite el argumento n del comando anterior, con 0 siendo el comando en sí mismo:

~/project $ ls -a -l 
total 32
drwxrwxr-x  7 user user 4096 Sep  9 20:30 .
drwx------ 16 user user 4096 Sep  9 20:10 ..
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir1
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir2
drwxrwxr-x  2 user user 4096 Sep  9 20:30 dir3
-rw-rw-r--  1 user user    0 Sep  9 16:02 file
-rw-rw-r--  1 user user    0 Sep  5 16:07 .file
-rw-rw-r--  1 user user    0 Sep  9 16:01 file1
-rw-rw-r--  1 user user    0 Sep  9 16:01 file2
-rw-rw-r--  1 user user   16 Sep  9 16:03 hello.txt
drwxrwxr-x  2 user user 4096 Sep  5 16:08 .hidden_dir
-rw-rw-r--  1 user user    0 Sep  5 16:08 .hidden_file
~/project $ ls !:1
ls -a
.  ..  dir  dir1  dir2  dir3  file  .file  file1  file2  hello.txt  .hidden_dir  .hidden_file

Segundo, !!:$ repite el último argumento del comando anterior. Puede acortar este comando a !$ y $_ :

project $ mkdir dir3
project $ cd !$
cd dir3
project/dir3 $ 

Podría preguntar:"¿Qué pasa si quiero usar esta técnica con un comando que emití anteriormente, pero no el más reciente?" Puede hacerlo con los comandos bang, usando cualquiera de los siguientes:

!<command you've issued previously >:$ 

$ mkdir -p hello/test1/test2
$ ls !mkdir:$
ls hello/test1/test2

o:

!<command you've issued previously >:n

$ ls !mk:2
ls hello/test1/test2

A veces, es posible que desee imprimir el comando, pero no quiere que se ejecute. Puedes realizar esta tarea con !:p :

~/project $ cat hello.txt 
Hello world ..!
~/project $ !:p
cat hello.txt 
~/project $ 

De hecho, puede imprimir cualquier comando en su lista de historial sin ejecutarlo. Simplemente emita uno de los siguientes:

$ !<command>:p

$ !mkdir:p
mkdir -p hello/test1/test2

$ !<string>:p

$ !su:p
sudo yum check-update
$ !mk:p
mkdir -p hello/test1/test2

Recuperar comandos con búsqueda inversa

Como administrador de sistemas, probablemente emita cientos de comandos todos los días. Es posible que le resulte difícil recordar algunos comandos o recordar parte de uno. Aquí tienes otra opción para encontrar el que necesitas.

(reverse-i-search)`<search string>’: <output> (reverse-i-search)`yu': sudo yum check-update
(reverse-i-search)`cd': cd /etc

CTRL+R activa reverse-i-search , que proporciona un área de búsqueda agradable, brindándole una manera más fácil de navegar a través de su historial.

Conclusión

Estos son útiles bash bang (! ) comandos con los que todo administrador de sistemas debería estar familiarizado. Estos comandos ahorran toneladas de tiempo y le brindan la capacidad de corregir rápidamente los errores de comando. Lea más sobre bash en su página man, con el comando man bash .

[¿Quiere probar Red Hat Enterprise Linux? Descárguelo ahora gratis.]


Linux
  1. 8 consejos para la línea de comandos de Linux

  2. Tener una vaca en la línea de comandos de Linux

  3. Encárguese en la línea de comandos de Linux

  4. Consejos de Bash para el día a día en la línea de comandos

  5. Yoda:el asistente personal de línea de comandos para su sistema Linux

Ripgrep:la herramienta de búsqueda de línea de comandos más rápida para Linux

Los 40 comandos útiles del servidor Linux para principiantes y profesionales

Los 50 comandos IP útiles de Linux para administradores de red

5 comandos para ver el contenido de un archivo en la línea de comandos de Linux

Comandos prácticos de Linux y Unix Tee para el administrador de Linux

Cuatro navegadores web para la línea de comandos de Linux