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

Nunca olvides transmitir sudo antes de un pedido? ¿Alguna vez ha tenido que repetir un comando completo porque tenía 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.

Índice

    Fundamentos de la repetición de comandos

    Bash brinda acceso a la lista de comandos que ha emitido anteriormente, conocida como historial de comandos. El valor de HISTSIZE La variable define el número de pedidos guardados en su lista de historial. De forma predeterminada, este valor es 500. Estos comandos emitidos anteriormente (llamados su lista de historial) se almacenan en su archivo de historial. Su ubicación por defecto 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 comandos repetidos

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

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

    El golpe (!) 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
    
    

    Repita el último comando coincidente en cualquier lugar de una cadena

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

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

    Repita la ny ordenar desde tu historial

    repetir ny Ordenar tu historial de bash (contando desde arriba) es tan simple como usar un bong con el número en cuestión:

    !10
    

    Repita el comando n de su última entrada en el historial

    repetir ny Ordenar tu 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 boom boom (!!) repite el último comando en la lista de historial, comportándose de la misma manera 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 un prefijo sudo, o salir del tubo:

    $ 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 reemplazar una cadena

    A menudo emito comandos largos y los vuelvo a emitir con diferentes interruptores. O necesito volver a ejecutar 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 de lograr este resultado. Una es usar:

    !!: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 realizar una sustitución de cadenas para un comando que no era el más reciente.

    La otra forma de lograr este resultado es a través de la estructura. ^<old>^<new>. Este formato reemplaza cadenas con 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, la forma !:n repetir la ny argumento 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
    

    El 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 hacer esto 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

    Donde:

    !<command you've issued previously >:n
    
    $ ls !mk:2
    ls hello/test1/test2

    A veces, es posible que desee imprimir el comando, pero no desea que se ejecute. Puede 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 reverse-i-search

    Como administrador del sistema, probablemente emita cientos de comandos todos los días. Es posible que tenga problemas para recordar ciertos comandos o recordar parte de ellos. Aquí tienes otra opción para encontrar la que necesitas.

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

    CTRL+R activo reverse-i-search, que proporciona un buen cuadro de búsqueda, lo que facilita la navegación a través de su historial.

    Conclusión

    Estos son golpes de bash útiles (!) comandos que todo administrador de sistemas debería conocer. Estos comandos le ahorran mucho tiempo y le permiten corregir errores de comando rápidamente. Lea más sobre bash en su página man, con el comando man bash.

    Artículos de interés

    Subir