10 usos asombrosos y misteriosos del símbolo u operador (!) En los comandos de Linux


El símbolo u operador '!' en Linux se puede utilizar como operador de negación lógica, así como para recuperar comandos del historial con ajustes o para ejecutar comandos ejecutados previamente con modificaciones. Todos los comandos siguientes se han verificado explícitamente en bash Shell. Aunque no lo he comprobado, la mayoría de estos no se ejecutarán en otro shell. Aquí entramos en los asombrosos y misteriosos usos del símbolo u operador '!' en los comandos de Linux.

Es posible que no se dé cuenta del hecho de que puede ejecutar un comando desde su comando de historial (comandos ya/ejecutados anteriormente). Para comenzar, primero busque el número de comando ejecutando el comando "historial".

$ history

Ahora ejecute un comando del historial solo por el número en el que aparece, en la salida del historial. Diga ejecutar un comando que aparece en el número 1551 en la salida del comando "historial".

$ !1551

Y ejecuta el comando (comando superior en el caso anterior), que se enumeró en el número 1551. Esta forma de recuperar el comando ya ejecutado es muy útil, especialmente en el caso de aquellos comandos que son largos. Solo necesita llamarlo usando! [Número en el que aparece en la salida del comando de historial].

Puede ejecutar los comandos que ha ejecutado anteriormente por su secuencia de ejecución, siendo el último comando de ejecución representado como -1, el penúltimo como -2, el séptimo último como -7,….

Primero ejecute el comando del historial para obtener una lista del último comando ejecutado. Es necesario ejecutar el comando history, de modo que pueda estar seguro de que no hay ningún comando como rm command> file y otros solo para asegurarse de no ejecutar ningún comando peligroso accidentalmente. Y luego marque el sexto último comando, el octavo último comando y el décimo último comando.

$ history
$ !-6
$ !-8
$ !-10

Necesito enumerar el contenido del directorio "/ home/mial/Binary/firefox", así que disparé.

$ ls /home/$USER/Binary/firefox

Entonces me di cuenta de que debería haber disparado "ls -l" para ver qué archivo es ejecutable allí. ¡Entonces debería escribir todo el comando nuevamente! No, no lo necesito. Solo necesito llevar el último argumento a este nuevo comando como:

$ ls -l !$

Aquí ! $ llevará los argumentos pasados u200bu200ben el último comando a este nuevo comando.

Supongamos que creé un archivo de texto 1.txt en el escritorio.

$ touch /home/avi/Desktop/1.txt

y luego cópielo en "/ home/avi/Downloads" usando la ruta completa a cada lado con el comando cp.

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

Ahora hemos pasado dos argumentos con el comando cp. Primero es "/home/avi/Desktop/1.txt" y el segundo es "/ home/avi/Downloads", manejémoslos de manera diferente, simplemente ejecute echo [argumentos] para imprimir ambos argumentos de manera diferente.

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

Nota El primer argumento se puede imprimir como “! ^” y el resto de los argumentos se pueden imprimir ejecutando “! [Name_of_Command]: [Number_of_argument]” .

En el ejemplo anterior, el primer comando era "cp" y se necesitaba un segundo argumento para imprimir. Por lo tanto, “! Cp: 2” , si algún comando dice que xyz se ejecuta con 5 argumentos y necesita obtener el cuarto argumento, puede usar “! Xyz: 4” , y úsalo como quieras. Se puede acceder a todos los argumentos mediante “! *” .

Podemos ejecutar el último comando ejecutado sobre la base de palabras clave. Podemos entenderlo de la siguiente manera:

$ ls /home > /dev/null						[Command 1]
$ ls -l /home/avi/Desktop > /dev/null		                [Command 2]	
$ ls -la /home/avi/Downloads > /dev/null	                [Command 3]
$ ls -lA /usr/bin > /dev/null				        [Command 4]

Aquí hemos usado el mismo comando (ls) pero con diferentes interruptores y para diferentes carpetas. Además, hemos enviado la salida de cada comando a "/ dev/null" ya que no vamos a tratar con la salida del comando y la consola permanece limpia.

Ahora ejecute el último comando de ejecución sobre la base de palabras clave.

$ ! ls					[Command 1]
$ ! ls -l				[Command 2]	
$ ! ls -la				[Command 3]
$ ! ls -lA				[Command 4]

Verifique la salida y se sorprenderá de que está ejecutando comandos ya ejecutados solo con las palabras clave ls .

Puede ejecutar/modificar su último comando de ejecución usando (!!) . Llamará al último comando de ejecución con alter/tweak en el comando actual. Te mostramos el escenario

El último día ejecuté un script de una sola línea para obtener mi IP privada, así que ejecuté,

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

Entonces, de repente, me di cuenta de que necesito redirigir la salida del script anterior a un archivo ip.txt, entonces, ¿qué debo hacer? ¿Debo volver a escribir todo el comando y redirigir la salida a un archivo? Bueno, una solución fácil es usar la tecla de navegación UP y agregar '> ip.txt' para redirigir la salida a un archivo como.

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

Gracias a la tecla de navegación de Life Savior UP aquí. Ahora considere la siguiente condición, la próxima vez que ejecute un script de una sola línea.

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

Tan pronto como ejecuté el script, el indicador de bash devolvió un error con el mensaje "bash: ifconfig: command not found" , no fue difícil para mí adivinar que ejecuté este comando como usuario donde debería ser ejecutado como root.

Entonces, ¿cuál es la solución? ¡Es difícil iniciar sesión en root y luego escribir el comando completo nuevamente! Además, (tecla de navegación ARRIBA) en el último ejemplo no vino a rescatar aquí. ¿Entonces? Necesitamos llamar a “!!” sin comillas, lo que llamará al último comando de ese usuario.

$ su -c “!!” root

Aquí su es cambiar de usuario que es root, -c es ejecutar el comando específico como usuario y la parte más importante !! será reemplazada por comando y último comando de ejecución será sustituido aquí. ¡Si! Debe proporcionar la contraseña de root.

¡Utilizo !! principalmente en los siguientes escenarios,

1. Cuando ejecuto el comando apt-get como usuario normal, normalmente aparece un error que dice que no tiene permiso para ejecutar.

$ apt-get upgrade && apt-get dist-upgrade

Error de Opps ... no se preocupe, ejecute el siguiente comando para que tenga éxito ...

$ su -c !!

De la misma manera que yo para

$ service apache2 start
or
$ /etc/init.d/apache2 start
or
$ systemctl start apache2

El usuario de OOPS no está autorizado para realizar dicha tarea, así que ejecuto ..

$ su -c 'service apache2 start'
or
$ su -c '/etc/init.d/apache2 start'
or
$ su -c 'systemctl start apache2'

El ! (NO lógico) se puede utilizar para ejecutar el comando en todos los archivos/extensiones excepto que está detrás de '!' .

A. Elimine todos los archivos de un directorio excepto el que tiene el nombre 2.txt.

$ rm !(2.txt)

B. Elimine todos los tipos de archivo de la carpeta excepto el que tiene la extensión "pdf".

$ $ rm !(*.pdf)

Aquí usaremos '! -d ' para validar si el directorio existe o no seguido por el operador lógico AND (&&) para imprimir que el directorio no existe y el operador lógico OR (||) para imprimir el directorio está presente.

La lógica es, cuando la salida de [! -d/home/avi/Tecmint] es 0, ejecutará lo que se encuentra más allá de Logical Y, de lo contrario, irá a Logical OR (||) y ejecutará lo que se encuentra más allá de Logical OR.

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'

Similar a la condición anterior, pero aquí si el directorio deseado no existe, saldrá del comando.

$ [ ! -d /home/avi/Tecmint ] && exit

Una implementación general en Scripting Language donde si el directorio deseado no existe, creará uno.

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

Eso es todo por ahora. Si conoce o se encuentra con cualquier otro uso de '!' que vale la pena conocer, es posible que desee proporcionarnos su sugerencia en los comentarios. ¡Mantente conectado!