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
Imprimir comandos
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
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.]