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-15se 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 FooEnterecho !$ JarDigite Para cima Digite ; e -
echo FooDigiteecho $_ JarInsira 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.
echoalgo se você ' não tiver certeza do que ' fará.echo $(rm -rf /)--no-preserve-rootlá, e se você vir as palavras " sem preservação " em um programa, é melhor pensar com muito cuidado sobre o que ele faz.