¿Qué significa! $?

Estoy siguiendo un tutorial y menciona ejecutar este comando:

sudo chmod 700 !$ 

«No estoy familiarizado con !$. ¿Qué significa?

Comentarios

  • Es ' generalmente seguro intentar echo algo si ' no está seguro de lo que ' hará.
  • @Shadur, no siempre. echo $(rm -rf /)
  • @cjm A menos que ' estés en un sistema realmente antiguo, ' Necesitará la opción --no-preserve-root ahí, y si ve las palabras " no preserve " en un programa, es mejor que piense detenidamente acerca de lo que hace.
  • @WChargin Tenga mucho cuidado al asumir que " realmente antiguo " y " no Linux / no usan GNU coreutils " son lo mismo; no son ' t.

Respuesta

Básicamente, «es el último argumento del comando anterior.

!$ es el» final «del comando anterior . Considere el siguiente ejemplo: Comenzamos buscando una palabra en un archivo:

grep -i joe /some/long/directory/structure/user-lists/list-15 

si joe está en esa lista de usuarios, queremos eliminarlo. . Podemos iniciar vi con ese árbol de directorios largo como argumento, o tan simplemente como vi !$ Al que bash se expande:

vi /some/long/directory/structure/user-lists/list-15 

( fuente ; guía práctica, por cierto)


No vale nada la distinción entre este !$ token y la variable de shell especial $_ . De hecho, ambos se expanden hasta el último argumento del comando anterior. Sin embargo, !$ se expande durante la expansión del historial , mientras que $_ se expande durante la expansión de parámetros . Una consecuencia importante de esto es que, cuando usa !$, el comando expandido se guarda en su historial.

Por ejemplo, considere las pulsaciones de teclas

  • echo Foo Enter echo !$ Jar Entrar Arriba Entrar ; y

  • echo Foo Ingrese echo $_ Jar Enter Up Enter.

(Los únicos caracteres cambiados son $! y $_ en el medio.)

En el primero, cuando presiona Arriba , la línea de comando lee echo Foo Jar, por lo que la última línea escrita en stdout es Foo Jar.

En este último, cuando presiona Arriba , la línea de comandos dice echo $_ bar, pero ahora $_ tiene un valor diferente al que tenía antes; de hecho, $_ ahora es Jar, por lo que la última línea escrita en stdout es Jar Jar.

Otra consecuencia es que _ puede usarse en otras expansiones de parámetros, por ejemplo, la secuencia de comandos

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

imprime isomorphism isosceles. Pero no hay «${!$%morphism}» expansión análoga.

Para obtener más información sobre las fases de expansión en Bash, consulte la EXPANSION sección de man 1 bash (esto se llama Shell Expansions en la edición en línea). El HISTORY EXPANSION la sección está separada.

Comentarios

  • Bien. Es bueno saberlo. Además, es bueno que haya ' s Stack Exchange. Es ' s difícil buscar en Google algo como !$
  • Por cierto, en la línea de comandos, puede insertar el último argumento del comando anterior mediante insert-last-argument, generalmente vinculado a M-..
  • @Andrew, recuerde aceptar esto si responde a su pregunta. Aceptar y votar a favor en lugar de publicar comentarios es la forma en que se expresa el agradecimiento en la red SE, consulte aquí para " postura " oficial.
  • @Andrew FYI, busqué en Google " bash bang dollar " y obtuve resultados decentes, incluido este enlace como el tercer listado.
  • @terdon Traté de aceptar la respuesta anoche, pero fue tan rápido que estaba forzado a esperar para aceptarlo.

Responder

Estrictamente hablando !$ es la última palabra del último comando de la lista del historial.

palabra: una secuencia de caracteres tratados como una unidad por el shell. Las palabras no pueden incluir metacaracteres sin comillas.

metacaracteres: un carácter que, cuando no se cita, separa las palabras. Un metacarácter es un espacio en blanco o uno de los siguientes caracteres: |, &, ;, (, ), < , o >

en blanco: un espacio o un carácter de tabulación.

Ejemplos:

set -o history # enable command history set -o histexpand # enable ! style history substitution HISTSIZE=10 # save all lines on the history list HISTCONTROL= HISTIGNORE= date echo !$ # prints date date>/dev/null echo !$ # prints /dev/null echo a b c>/dev/null echo !$ # prints /dev/null HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list echo a b c echo d e f # space at the beginning echo !$ # prints c 

Comentarios

Answer

!$ le dará el último comando usado para ese usuario en particular ….

también puede encontrar el historial de comandos utilizados anteriormente usando el comando history … pruébelo ….

NOTA: Para un usuario en particular, todos los comandos utilizados anteriormente se almacenarán en el archivo de historial de bash.

Comentarios

  • Las otras respuestas son correctas. Este es incorrecto.

Deja una respuesta

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