Estou seguindo um tutorial e ele menciona como executar este comando:
sudo chmod 700 !$
Não estou familiarizado com !$
. O que significa?
Comentários
Resposta
Basicamente, “é o último argumento do comando anterior.
!$
é o” fim “do comando anterior . Considere o seguinte exemplo: Começamos procurando por uma palavra em um arquivo:grep -i joe /some/long/directory/structure/user-lists/list-15
se joe estiver nessa lista de usuários, queremos removê-lo dela . Podemos iniciar o vi com aquela longa árvore de diretório como argumento ou simplesmente como
vi !$
Qual bash se expande para:vi /some/long/directory/structure/user-lists/list-15
( fonte ; guia prático, a propósito)
Não vale a pena distinguir entre este !$
token e a variável shell especial $_
. Na verdade, ambos se expandem para o último argumento do comando anterior. No entanto, !$
é expandido durante a expansão do histórico , enquanto $_
é expandido durante a expansão do parâmetro . Uma consequência importante disso é que, quando você usa !$
, o comando expandido é salvo em seu histórico.
Por exemplo, considere as teclas
-
echo Foo
Enterecho !$ Jar
Digite Para cima Digite ; e -
echo Foo
Digiteecho $_ Jar
Insira Up Enter.
(Os únicos caracteres alterados são $!
e $_
no meio.)
No primeiro, quando você pressiona Up , a linha de comando lê echo Foo Jar
, então a última linha gravada em stdout é Foo Jar
.
No último, quando você pressiona Up , a linha de comando mostra echo $_ bar
, mas agora $_
tem um valor diferente do que tinha anteriormente – de fato, $_
agora é Jar
, então a última linha gravada em stdout é Jar Jar
.
Outra consequência é que _
pode ser usado em outras expansões de parâmetro, por exemplo, a sequência de comandos
printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles
imprime isomorphism isosceles
. Mas não há expansão análoga “${!$%morphism}
“.
Para obter mais informações sobre as fases de expansão no Bash, consulte EXPANSION
seção de man 1 bash
(chamada de Expansões de shell na edição online). A HISTORY EXPANSION
a seção é separada.
Comentários
- Ótimo. Bom saber. Além disso, é bom saber ' s Stack Exchange. É ' difícil pesquisar no Google por algo como
!$
- BTW, na linha de comando, você pode inserir o último argumento do comando anterior por
insert-last-argument
, geralmente vinculado aM-.
. - @Andrew, lembre-se de aceitar isso se responder à sua pergunta. Aceitar e votar positivamente em vez de postar comentários é a forma como os agradecimentos são expressos na rede SE, consulte aqui para o " posição " oficial.
- @Andrew FYI, pesquisei no Google por " dólar bash bang " e obtivemos resultados decentes, incluindo este link como a terceira lista.
- @terdon Tentei aceitar a resposta ontem à noite, mas foi tão rápido que estava forçado a esperar para aceitá-lo.
Resposta
Estritamente falando !$
é a última palavra do último comando da lista de histórico.
palavra – Uma sequência de caracteres tratada como uma unidade pelo shell. As palavras não podem incluir metacaracteres não citados.
metacaractere – Um caractere que, quando não citados, separa as palavras. Um metacaractere é um espaço em branco ou um dos seguintes caracteres: |, &, ;, (, ), < ou >
em branco – Um espaço ou caractere de tabulação.
Exemplos:
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
Comentários
Resposta
!$
lhe dará o último comando usado para esse usuário em particular ….
você também pode encontrar o histórico de comandos usados anteriormente usando o comando history
… experimente ….
NOTA: Para um determinado usuário, todos os comandos usados anteriormente serão armazenados no arquivo de histórico do bash.
Comentários
- As outras respostas estão certas. Este está errado.
echo
algo se você ' não tiver certeza do que ' fará.echo $(rm -rf /)
--no-preserve-root
lá, e se você vir as palavras " sem preservação " em um programa, é melhor pensar com muito cuidado sobre o que ele faz.