A expansão do histórico deve ser citada?

0

Acabei de encontrar !$ (sem aspas). Eu não conheci isso antes e fiz alguns testes:

$ ls -l
(...some output...)
$ echo !$
-l
$ echo "!$"
-l

man bash diz isso na seção sobre expansão de histórico:

$ 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.

Feira suficiente. Mas devo citar ou não? Outro teste sobre a expansão da história me deixa em dúvida:

$ man bash
$ "!!"
"man bash"
bash: man bash: command not found

Isso poderia ser esperado. Mas então, e quanto a !$ ? Esta é uma palavra, então eu acho que deveria ser citado ...

(Vou arriscar essa nova tag aqui: .

    
por Tomasz 21.05.2018 / 21:38

2 respostas

2

Depende se você deseja adicionar um conjunto de citações em torno da palavra da expansão do histórico ou não.

Assumindo foo="abc def" , compare

$ echo $foo
$ printf "<%s>\n" !$

vs.

$ echo $foo
$ printf "<%s>\n" "!$"

O primeiro produz printf "<%s>\n" $foo , invocando a divisão de palavras e printf obtém dois argumentos após a cadeia de formatações. O segundo produz printf "<%s>\n" "$foo" , onde as aspas impedem a divisão de palavras, como de costume.

Claro, se você fizesse isso:

$ echo "$foo"

Em seguida, um !$ no seguinte comando já seria expandido para "$foo" , com as cotações já em vigor. Agora, usar "!$" produziria ""!$"" , onde as aspas efetivamente se cancelam.

    
por 21.05.2018 / 22:45
2

A substituição de histórico recupera o que foi analisado como a última palavra, aspas e tudo,

$ echo this that "the other"
this that the other
$ echo !$
the other

e ele é executado primeiro, para que você possa recuperar e executar outras substituições

$ echo 'date'
Mon May 21 13:53:37 PDT 2018
$ echo !$
Mon May 21 13:53:38 PDT 2018
    
por 21.05.2018 / 22:55