Cómo utilizar los comandos y expansiones del historial de Bash en un VPS Linux

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Establecer valores predeterminados del historial
  • Revisando tu historial de Bash anterior
  • Ejecutar comandos desde el historial de Bash
  • Navegando por el historial de Bash
  • Buscando en el historial de Bash
    1. Cómo buscar después de haber escrito parte del comando
  • Familiarizándose con la expansión de Historia más avanzada
    1. Designadores de eventos
    2. Designadores de palabras
    3. Modificadores
  • Conclusión
  • Cuando trabajes en un entorno de servidor, pasarás mucho tiempo en la línea de comandos. Lo más probable es que uses el shell bash, que es el predeterminado en la mayoría de las distribuciones.

    Durante una sesión de terminal, es probable que repitas algunos comandos con frecuencia y escribas variaciones de esos comandos con mayor frecuencia. Si bien escribir cada comando repetidamente puede ser una buena práctica al principio, en algún momento, puede llegar a ser una molestia y una interrupción.

    Afortunadamente, el shell bash tiene algunas funciones de historial bastante bien desarrolladas. Aprender a usar y manipular eficazmente el historial bash le permitirá pasar menos tiempo escribiendo y más tiempo haciendo su trabajo real. Muchos desarrolladores están familiarizados con la filosofía DRY de Don’t Repeat Yourself (No te repitas) . El uso eficaz del historial bash le permite operar más cerca de este principio y acelerará su flujo de trabajo.

    Prerrequisitos

    Para seguir esta guía, necesitarás tener acceso a una computadora que ejecute un sistema operativo basado en Linux. Puede ser un servidor privado virtual al que te hayas conectado mediante SSH o tu máquina local. Ten en cuenta que este tutorial se validó con un servidor Linux que ejecuta Ubuntu 20.04, pero los ejemplos que se dan deberían funcionar en una computadora que ejecute cualquier versión de cualquier distribución de Linux.

    Si planea utilizar un servidor remoto para seguir esta guía, le recomendamos que primero complete nuestra guía de configuración inicial del servidor . Al hacerlo, obtendrá un entorno de servidor seguro (que incluye un usuario no root con sudoprivilegios y un firewall configurado con UFW) que puede utilizar para desarrollar sus habilidades en Linux.

    Establecer valores predeterminados del historial

    Antes de comenzar a utilizar el historial de comandos, puede resultar útil ajustar algunas configuraciones de bash para que sea más útil. Estos pasos no son necesarios, pero pueden facilitar la búsqueda y ejecución de comandos que haya ejecutado anteriormente.

    Bash te permite ajustar la cantidad de comandos que almacena en el historial. En realidad, tiene dos opciones independientes para esto: el HISTFILESIZEparámetro configura cuántos comandos se guardan en el archivo de historial, mientras que el HISTSIZEcontrola la cantidad almacenada en la memoria para la sesión actual.

    Esto significa que puede establecer un límite razonable para el tamaño del historial en la memoria para la sesión actual y tener un historial aún más grande guardado en el disco que puede examinar más tarde. De manera predeterminada, bash establece valores muy conservadores para estas opciones, pero puede ampliarlos para aprovechar un historial más grande. Algunas distribuciones ya aumentan la configuración predeterminada del historial de bash con valores ligeramente más generosos.

    Abra el ~/.bashrcarchivo con el editor de texto que prefiera para cambiar esta configuración. Aquí utilizaremos nano:

    1. nano ~/.bashrc

    Busque los parámetros HISTSIZEy HISTFILESIZE. Si están configurados, no dude en modificar los valores. Si estos parámetros no están en su archivo, agréguelos ahora. Para los fines de esta guía, guardar 10 000 líneas en el disco y cargar las últimas 5000 líneas en la memoria funcionará bien. Esta es una estimación conservadora para la mayoría de los sistemas, pero puede ajustar estos números hacia abajo si nota un impacto en el rendimiento:

    ~/.bashrc

    . . .# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)HISTSIZE=5000HISTFILESIZE=10000. . .

    De forma predeterminada, bash escribe su historial al final de cada sesión, sobrescribiendo el archivo existente con una versión actualizada. Esto significa que si inicia sesión con varias sesiones de bash, solo se guardará el historial de la última sesión que salga.

    Puedes solucionar este problema configurando la histappendopción que agregará el historial en lugar de sobrescribirlo. Es posible que ya esté configurada, pero si no es así, puedes habilitarla agregando esta línea:

    ~/.bashrc

    . . .shopt -s histappend. . .

    Si desea que bash agregue inmediatamente comandos a su historial en lugar de esperar al final de cada sesión (para permitir que los comandos en una terminal estén disponibles instantáneamente en otra), también puede configurar o agregar el history -acomando al PROMPT_COMMANDparámetro, que contiene los comandos que se ejecutan antes de cada nuevo símbolo del sistema.

    Para configurar esto correctamente, necesitarás personalizar bash PROMPT_COMMANDpara cambiar la forma en que se registran los comandos en el archivo de historial y en la memoria de la sesión de shell actual:

    • Primero, debes anexarlo al archivo de historial inmediatamente con history -a.
    • A continuación, debes borrar el historial actual en tu sesión de shell con history -c.
    • Por último, para volver a cargar el historial actualizado en su sesión de shell, utilice el history -rcomando.

    Poner todos estos comandos juntos en orden en la PROMPT_COMMANDvariable de shell dará como resultado lo siguiente, que puedes pegar en tu .bashrcarchivo:

    ~/.bashrc

    . . .export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND". . .

    Cuando haya terminado, guarde el archivo y salga. Si editó el .bashrcarchivo con nano, hágalo presionando CTRL + X, Yy luego ENTER.

    Para implementar los cambios, cierre la sesión y vuelva a iniciarla, o sourceejecute el archivo:

    1. source ~/.bashrc

    Con esto, has ajustado la forma en que tu shell maneja tu historial de comandos. Ahora puedes practicar un poco para encontrar tus comandos anteriores con el historycomando.

    Revisando tu historial de Bash anterior

    La forma de revisar el historial de bash es usar el historycomando. Esto imprimirá nuestros comandos recientes, un comando por línea. Esto debería mostrar, como máximo, la cantidad de líneas que seleccionaste para la HISTSIZEvariable. Probablemente serán menos en este punto:

    1. history
    Output  . . .   43  man bash   44  man fc   45  man bash   46  fc -l -10   47  history   48  ls -a   49  vim .bash_history   50  history   51  man history   52  history 10   53  history

    Cada comando de historyretorno está asociado a un número para facilitar su consulta. Esta guía explicará cómo esto puede resultar útil más adelante.

    Puede truncar la salida especificando un número después del comando. Por ejemplo, si desea devolver solo los últimos 5 comandos que se ejecutaron, puede escribir:

    1. history 5
    Output   50  history   51  man history   52  history 10   53  history   54  history 5

    Para encontrar todos los historycomandos que contienen una cadena específica, puede canalizar los resultados a un grepcomando que busque una cadena determinada en cada línea. Por ejemplo, puede buscar las líneas que contienen cdescribiendo:

    1. history | grep cd
    Output   33  cd Pictures/   37  cd ..   39  cd Desktop/   61  cd /usr/bin/   68  cd   83  cd /etc/   86  cd resolvconf/   90  cd resolv.conf.d/

    Existen muchas situaciones en las que puede resultar útil poder recuperar una lista de comandos que haya ejecutado anteriormente. Si desea volver a ejecutar uno de esos comandos, es posible que su instinto le indique copiar uno de los comandos de su salida y pegarlo en el indicador. Esto funciona, pero bash incluye una serie de atajos que le permiten recuperar y luego ejecutar automáticamente comandos de su historial.

    Ejecutar comandos desde el historial de Bash

    Imprimir el historial de comandos puede ser útil, pero en realidad no ayuda a acceder a esos comandos salvo como referencia.

    Puede recuperar y ejecutar inmediatamente cualquiera de los comandos devueltos por una historyoperación por su número precedido por un signo de exclamación ( !). Suponiendo que sus historyresultados coincidan con los de la sección anterior, puede consultar historyrápidamente la página del manual del comando escribiendo:

    1. !51

    Esto recordará y ejecutará inmediatamente el comando asociado con el número de historial 51.

    También puedes ejecutar comandos relativos a tu posición actual utilizando la sintaxis, donde “n” se reemplaza por el número de comandos anteriores que deseas recordar.!-n

    A modo de ejemplo, supongamos que ejecutaste los dos comandos siguientes:

    1. ls /usr/share/common-licenses
    2. echo hello

    Si desea recordar y ejecutar el comando que ejecutó antes del más reciente (el lscomando), puede escribir !-2:

    1. !-2

    Para volver a ejecutar el último comando que ejecutó, puede ejecutar !-1. Sin embargo, bash proporciona un atajo que consta de dos signos de exclamación que sustituirán al comando más reciente y lo ejecutarán:

    1. !!

    Muchas personas usan esto cuando escriben un comando pero olvidan que necesitan sudoprivilegios para ejecutarlo. Al escribir, sudo !!se volverá a ejecutar el comando con sudodelante:

    1. touch /etc/hello
    Outputtouch: cannot touch `/etc/hello': Permission denied
    1. sudo !!
    Outputsudo touch /etc/hello[sudo] password for sammy:

    Esto demuestra otra propiedad de esta sintaxis: estos atajos son sustituciones puras y pueden incorporarse dentro de otros comandos a voluntad.

    Navegando por el historial de Bash

    Hay algunas formas de desplazarse por el historial de bash, colocando cada comando sucesivo en la línea de comando para editarlo.

    La forma más habitual de hacerlo es pulsar la tecla de flecha hacia arriba en el símbolo del sistema. Cada vez que pulse la tecla de flecha hacia arriba, retrocederá más en el historial de la línea de comandos.

    Si necesita ir en la otra dirección, la tecla de flecha hacia abajo recorre el historial en la dirección opuesta, y finalmente lo lleva de regreso al mensaje vacío actual.

    Si mover la mano hasta las teclas de flecha le parece una gran molestia, puede retroceder en su historial de comandos usando la CTRL + Pcombinación y usar la CTRL + Ncombinación para avanzar nuevamente en su historial.

    Si desea volver al símbolo del sistema actual, puede hacerlo presionando META + . En la mayoría de los casos, la tecla “meta” es la ALTclave, por lo que META + significará presionar ALT + SHIFT + .. Esto es útil si se encuentra muy atrás en su historial y desea volver a su símbolo del sistema vacío.

    También puedes ir a la primera línea de tu historial de comandos haciendo la maniobra opuesta y escribiendo META + . Esto normalmente significa presionar ALT + SHIFT + ,.

    Para resumir, estas son algunas teclas y combinaciones de teclas que puedes usar para desplazarte por el historial y saltar a cualquier extremo:

    • UP arrow key:Desplazarse hacia atrás en el historial
    • CTRL + P:Desplazarse hacia atrás en el historial
    • DOWN arrow key:Desplazarse hacia adelante en el historial
    • CTRL + N:Desplazarse hacia adelante en el historial
    • ALT + SHIFT + .: Saltar al final del historial (más reciente)
    • ALT+ SHIFT + ,:Saltar al comienzo de la historia (más lejano)

    Buscando en el historial de Bash

    Si bien enviar el historycomando greppuede ser una forma útil de limitar los resultados, no es ideal en muchas situaciones.

    Bash incluye una función de búsqueda para su historial. La forma típica de utilizarla es buscando hacia atrás en el historial (los resultados más recientes aparecen primero) utilizando la CTRL + Rcombinación de teclas.

    Por ejemplo, puedes escribir CTRL + Ry comenzar a escribir parte del comando anterior. Solo tienes que escribir una parte del comando. Si coincide con un comando no deseado, puedes presionar CTRL + Rnuevamente para obtener el siguiente resultado.

    Si por accidente pasas el comando que querías, puedes moverte en la dirección opuesta escribiendo CTRL + S. Esto también puede ser útil si te has movido a un punto diferente en tu historial usando las teclas en la última sección y deseas buscar hacia adelante.

    Tenga en cuenta que, en muchas terminales, la CTRL + Scombinación está asignada para suspender la sesión de la terminal. Esto interceptará cualquier intento de pasar CTRL + Sa bash y “congelará” su terminal. Para descongelarla, escriba CTRL + Qpara anular la suspensión de la sesión.

    Esta función de suspensión y reanudación no es necesaria en la mayoría de las terminales modernas, y puedes desactivarla sin ningún problema ejecutando el siguiente comando:

    1. stty -ixon

    sttyes una utilidad que te permite cambiar la configuración de tu terminal desde la línea de comandos. Puedes agregar este stty -ixoncomando al final de tu ~/.bashrcarchivo para que el cambio sea permanente.

    Si intenta buscar CTRL + Snuevamente ahora, debería funcionar como se espera y permitirle buscar hacia adelante.

    Cómo buscar después de haber escrito parte del comando

    Una situación común es escribir parte de un comando y luego darse cuenta de que ya lo ha ejecutado anteriormente y puede buscarlo en el historial.

    La forma correcta de buscar usando lo que ya está en su línea de comando es mover el cursor al principio de la línea con CTRL + A, llamar al historial inverso con CTRL + R, pegar la línea actual en la búsqueda con CTRL + Yy luego usar CTRL + Rnuevamente para buscar en reversa.

    Por ejemplo, supongamos que desea actualizar la caché de paquetes en un sistema Ubuntu. Ya escribió esto recientemente, pero no pensó en ello hasta que lo escribió sudonuevamente en el mensaje:

    1. sudo

    En este punto, te das cuenta de que se trata de una operación que definitivamente has realizado en el último día o así. Puedes presionar CTRL + Apara mover el cursor al principio de la línea. Luego, presiona CTRL + Rpara llamar a la búsqueda incremental inversa del historial. Esto tiene el efecto secundario de copiar todo el contenido de la línea de comandos que estaba después de la posición del cursor y colocarlo en el portapapeles.

    A continuación, pulsa CTRL + Ypara pegar en la búsqueda los segmentos de comandos que acabas de copiar de la línea de comandos. Por último, pulsa CTRL + Rpara retroceder en el historial y buscar comandos que contengan el contenido que acabas de pegar.

    Al principio, usar atajos como este puede resultar tedioso, pero puede resultar muy útil cuando te acostumbras. Resulta de gran ayuda cuando te encuentras en una situación en la que has escrito la mitad de un comando complejo y sabes que vas a necesitar el historial para terminar el resto.

    En lugar de pensar en ellas como combinaciones de teclas independientes, puede resultarle útil pensar en ellas como una única operación compuesta. Puede mantener CTRLpresionada la tecla y luego presionar A, R, Yy luego la Rtecla nuevamente presionada sucesivamente.

    Familiarizándose con la expansión de Historia más avanzada

    En esta guía ya se han abordado algunas de las técnicas de expansión del historial más fundamentales que ofrece bash. Algunas de las que hemos tratado hasta ahora son:

    • !!:Expandir hasta el último comando
    • !n:Expande el comando con el número de historial “n”.
    • !-n:Expandir al comando que fue “n” número de comandos antes del comando actual en el historial.

    Designadores de eventos

    Los tres ejemplos anteriores son instancias de designadores de eventos . Por lo general, son formas de recuperar comandos del historial anterior utilizando ciertos criterios. Son la parte de selección de las operaciones disponibles.

    Por ejemplo, puedes ejecutar el último sshcomando que ejecutaste escribiendo algo como:

    1. !ssh

    Esto busca líneas en el historial de comandos que comiencen con ssh. Si desea buscar una cadena que no esté al principio del comando, puede rodearla con ?caracteres. Por ejemplo, para repetir un apt-cache searchcomando anterior, probablemente podría ejecutar el siguiente comando para encontrarlo y ejecutarlo:

    1. !?search?

    Otro designador de eventos que puede probar implica sustituir una cadena dentro de su último comando por otra. Para ello, introduzca un símbolo de intercalación ( ^) seguido de la cadena que desea reemplazar, luego, inmediatamente después, otro símbolo de intercalación, la cadena de reemplazo y un símbolo de intercalación final al final. No incluya ningún espacio a menos que sea parte de la cadena que desea reemplazar o parte de la cadena que desea utilizar como reemplazo:

    1. ^original^replacement^

    Esto recuperará el comando anterior (como !!), buscará una instancia de originaldentro de la cadena de comando y la reemplazará con replacement. Luego ejecutará el comando usando la cadena de reemplazo.

    Esto resulta útil para solucionar problemas como errores ortográficos. Por ejemplo, supongamos que ejecuta este comando por error al intentar leer el contenido del /etc/hostsarchivo:

    1. cat /etc/hosst
    Outputcat: /etc/hosst: No such file or directory

    En lugar de reescribir el comando completo, puedes ejecutar lo siguiente:

    1. ^hosst^hosts^

    Esto solucionará el error en el comando anterior y lo ejecutará correctamente.

    Designadores de palabras

    Después de los designadores de eventos, puede agregar dos puntos ( :) seguidos de un designador de palabra para seleccionar una parte del comando coincidente.

    Para ello, divide el comando en “palabras”, que se definen como cualquier fragmento separado por un espacio en blanco. Esto le permite algunas oportunidades interesantes para interactuar con los parámetros del comando.

    La numeración de palabras comienza en el comando inicial como “0”, el primer argumento como “1” y continúa desde allí.

    Por ejemplo, puede enumerar el contenido de un directorio y luego decidir que desea navegar hasta ese mismo directorio. Puede hacerlo ejecutando las siguientes operaciones una tras otra:

    1. ls /usr/share/common-licenses
    2. cd !!:1

    En casos como este, donde se opera sobre el último comando, se puede acortar eliminando el segundo !y los dos puntos:

    1. cd !1

    Esto funcionará de la misma manera.

    Puede hacer referencia al primer argumento con un signo de intercalación ( ^) y al argumento final con un signo de dólar ( $) si eso tiene sentido para sus propósitos. Estos son más útiles cuando se utilizan rangos en lugar de números específicos. Por ejemplo, tiene tres formas de obtener todos los argumentos de un comando anterior en un nuevo comando:

    1. !!:1*
    2. !!:1-$
    3. !!:*

    El solo *se expande a todas las partes del comando que se está recordando, excepto el comando inicial. De manera similar, puede usar un número seguido de *para indicar que se debe incluir todo lo que esté después de la palabra especificada.

    Modificadores

    Otra cosa que puede hacer para mejorar el comportamiento de la línea del historial que está recuperando es modificar el comportamiento de la recuperación para manipular el texto en sí. Para ello, puede agregar modificadores después de un :carácter de dos puntos ( ) al final de una expansión.

    Por ejemplo, puedes cortar la ruta que lleva a un archivo usando el hmodificador (significa “cabeza”), que elimina la ruta hasta el /carácter de barra final ( ). Ten en cuenta que esto no funcionará de la forma que deseas si lo estás usando para truncar una ruta de directorio y la ruta termina con una barra final.

    Un caso de uso común para esto es si está modificando un archivo y se da cuenta de que le gustaría cambiar el directorio del archivo para realizar operaciones en archivos relacionados.

    Por ejemplo, supongamos que ejecuta este comando para imprimir el contenido de una licencia de software de código abierto en su salida:

    1. cat /usr/share/common-licenses/Apache-2.0

    Una vez que esté seguro de que la licencia se adapta a sus necesidades, puede cambiar al directorio donde se encuentra. Puede hacerlo ejecutando el cdcomando en la cadena de argumentos y cortando el nombre del archivo al final:

    1. cd !!:$:h

    Si ejecuta pwd, que imprime su directorio de trabajo actual, encontrará que ha navegado al directorio incluido en el comando anterior:

    1. pwd
    Output/usr/share/common-licenses

    Una vez que esté allí, es posible que desee abrir ese archivo de licencia nuevamente para verificarlo, esta vez en un buscapersonas como less.

    Para ello, puede realizar el proceso inverso de la manipulación anterior cortando la ruta y utilizando solo el nombre del archivo con el tmodificador, que significa “cola”. Puede buscar su última catoperación y usar el tindicador para pasar solo el nombre del archivo:

    1. less !cat:$:t

    También podrías conservar el nombre de la ruta absoluta completa y este comando funcionaría correctamente en este caso. Sin embargo, puede haber otras ocasiones en las que esto no sea así. Por ejemplo, podrías estar mirando un archivo anidado dentro de algunos subdirectorios debajo de tu directorio de trabajo actual usando una ruta relativa y luego cambiar al subdirectorio usando el modificador “h”. En este caso, ya no podrías confiar en el nombre de la ruta relativa para llegar al archivo.

    Otro modificador extremadamente útil es el rmodificador que elimina la extensión final. Esto puede resultar útil si está utilizando el comando tarpara extraer un archivo y luego desea cambiar al directorio resultante. Suponiendo que el directorio generado tenga el mismo nombre que el archivo, puede hacer algo como:

    1. tar xzvf long-project-name.tgz
    2. cd !!:$:r

    Si su archivo tar usa la tar.gzextensión en lugar de tgz, puede simplemente pasar el modificador dos veces:

    1. tar xzvf long-project-name.tgz
    2. cd !!:$:r:r

    Un modificador similar, e, elimina todo excepto la extensión final.

    Si no desea ejecutar el comando que está recuperando y solo desea encontrarlo, puede usar el pmodificador para que bash repita el comando en lugar de ejecutarlo.

    Esto es útil si no estás seguro de si estás seleccionando la pieza correcta. No solo la imprime, sino que también la coloca en tu historial para editarla más adelante si deseas modificarla.

    Por ejemplo, imagina que ejecutaste un findcomando en tu directorio de inicio y luego te diste cuenta de que querías ejecutarlo desde el /directorio raíz ( ). Podrías comprobar que estás haciendo las sustituciones correctas de esta manera (suponiendo que el comando original está asociado con el número 119 en tu historial):

    1. find ~ -name "file1"
    2. !119:0:p / !119:2*:p
    Outputfind / -name "file1"

    Si el comando devuelto es correcto, puedes ejecutarlo con la CTRL + P combinación de teclas.

    También puedes hacer sustituciones en tu comando utilizando la sintaxis.s/original/new/

    Por ejemplo, podrías haberlo logrado escribiendo:

    1. !119:s/~///

    Esto sustituirá la primera instancia del patrón de búsqueda ( ~).

    Puedes sustituir cada coincidencia pasando también la gbandera con s. Por ejemplo, si quieres crear archivos llamados file1, file2, y file3, y luego quieres crear directorios llamados dir1, dir2, dir3, puedes hacer esto:

    1. touch file1 file2 file3
    2. mkdir !!:*:gs/file/dir/

    Por supuesto, puede resultar más intuitivo ejecutarlo mkdir dir1 dir2 dir3en este caso. Sin embargo, a medida que se familiarice con el uso de modificadores y otras herramientas de expansión del historial de bash, podrá ampliar en gran medida sus capacidades y productividad en la línea de comandos.

    Conclusión

    Al leer esta guía, debería tener una buena idea de cómo puede aprovechar las operaciones de historial disponibles. Algunas de ellas probablemente serán más útiles que otras, pero es bueno saber que bash tiene estas capacidades en caso de que se encuentre en una posición en la que sería útil desenterrarlas.

    Como mínimo, el historycomando por sí solo, la búsqueda inversa y las expansiones del historial básico pueden hacer mucho para ayudarle a acelerar su flujo de trabajo.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion