O que significa! $ no script Bash?

5

Ao ler o conteúdo de um script, encontrei algo como:

echo "An Example" > !$

Então, pergunto-me o que significa !$ no bash.

    
por nux 10.07.2014 / 15:22

2 respostas

4

Bem, eu descobri isso! $ significa último argumento , por exemplo:

touch /tmp/file1

Aqui, o argumento é / tmp / file1 , então ! $ substituiu /tmp/file1 no exemplo de eco.

Se você digitar o comando du -b !$ , a saída será o uso do disco em bytes para /tmp/file1

    
por nux 10.07.2014 / 15:22
9

De man bash (algures depois da linha 3813):

!      Start  a  history substitution, except when followed by a blank,
          newline, carriage return, = or ( (when the extglob shell  option
          is enabled using the shopt builtin).

[...]

$      The  last  word.   This  is  usually the last argument, but will
          expand to the zeroth word if there is only one word in the line.

Assim, o !$ irá recuperar o último argumento do último comando do histórico.

Aqui estão alguns exemplos e equivalentes:

$ echo foo bar
foo bar
$ echo !$ # recall the last argument from the last command from history
echo bar
bar

$ echo foo bar
foo bar
$ echo !:$ # the same like '!$'
echo bar
bar

$ echo foo bar
foo bar
$ echo !:2  # recall the second (in this case the last) argument from the last command from history
echo bar
bar

$ echo foo bar
foo bar
$ echo $_ # gives the last argument from the last command from history
bar

$ echo foo bar
foo bar
$ echo Alt+. # pressing Alt and . (dot) in the same time will automatically insert the last argument from the last command from history
bar

$ echo foo bar
foo bar
$ echo Alt+_ # the same like when you press Alt+.
bar

$ echo foo bar
foo bar
$ echo Esc. # the same like when you press Alt+.
bar

Tudo isso funcionará somente dentro de um shell interativo . Mas se você usar esse comando da sua pergunta dentro de um script como você disse que você semeou, então as coisas são diferentes: quando você executar o script, ele será iniciado em um novo shell, um não interativo shell, então a expansão do histórico não tem nenhum efeito neste caso e então o comando:

echo "An Example" > !$

cria o arquivo !$ se não estiver presente (caso contrário, substitui-o) e escreve An Example nele.

    
por Radu Rădeanu 10.07.2014 / 19:41