O que! $ Significa?

Estou seguindo um tutorial e ele menciona como executar este comando:

sudo chmod 700 !$ 

Não estou familiarizado com !$. O que significa?

Comentários

  • É ' geralmente seguro tentar echo algo se você ' não tiver certeza do que ' fará.
  • @Shadur, nem sempre. echo $(rm -rf /)
  • @cjm A menos que você ' esteja em um sistema muito antigo, você ' Vou precisar da opção --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.
  • @WChargin Seja muito cuidadoso presumindo que " realmente antigo " e " não Linux / não usando GNU coreutils " são a mesma coisa; eles não são ' t.

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 Enter echo !$ Jar Digite Para cima Digite ; e

  • echo Foo Digite echo $_ 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 a M-..
  • @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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *