Estoy siguiendo un tutorial y menciona ejecutar este comando:
sudo chmod 700 !$
«No estoy familiarizado con !$
. ¿Qué significa?
Comentarios
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
Enterecho !$ Jar
Entrar Arriba Entrar ; y -
echo Foo
Ingreseecho $_ 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 aM-.
. - @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.
echo
algo si ' no está seguro de lo que ' hará.echo $(rm -rf /)
--no-preserve-root
ahí, y si ve las palabras " no preserve " en un programa, es mejor que piense detenidamente acerca de lo que hace.