Quando executamos um comando é salvo o último argumento no _
qual podemos acessar:
$ echo $_
Não parece um recurso muito útil. Então, por que se preocupar? Existem aplicações práticas?
Quando executamos um comando é salvo o último argumento no _
qual podemos acessar:
$ echo $_
Não parece um recurso muito útil. Então, por que se preocupar? Existem aplicações práticas?
Ele tem usos interativos e pode ser explorado para perpetrar "golfe de código".
Pode reduzir o código evitando a necessidade de uma variável temporária, como:
para
Não vejo esse
$_
recurso entre os Parâmetros Especiais do POSIX; é uma extensão do Bash (possivelmente em outros shells).É um hack mal implementado, que quebra quando você arma uma
debug
armadilha, conforme demonstrado pelo seguinte script:A saída no Bash 4.4.20 é:
Você pode ver que quando habilitamos o debug trap, ele
$_
não assume mais o valor esperadoabc
apósecho abc
. Na especificação de$_
, "último comando" refere-se literalmente ao comando executado mais recentemente, não ao comando anterior na sequência de comandos.Você definitivamente não quer usar isso em nenhum programa Bash que alguém queira depurar com um depurador implementado com a ajuda da armadilha de depuração.
O uso interativo
$_
é o mesmo: consulte o último argumento do comando anterior. Isso levanta a questão: por que alguém usaria isso em vez de um dos comandos M- _ou M- .que expandem o mesmo item na linha de comando?As diferenças
$_
são que:É muito mais compacto do que a expansão de um longo caminho.
Quando um comando with
$_
é recuperado do histórico, ele não se refere mais ao seu próprio antecessor no histórico, mas a qualquer comando executado mais recentemente. Isso pode ser explorado. Podemos recuperar e reutilizar um comando que contém$_
o argumento correto usado mais recentemente, em vez de repetir exatamente um comando antigo com os mesmos argumentos.O conteúdo produzido por M.é baseado na linha de comando bruta e não expandida, enquanto
$_
produz o último argumento real do comando anterior. Podemos mostrar essa diferença assim:No ponto indicado pelo bloco do cursor
█
, digite o M.comando. Meta Mpode ser Escou o Altmodificador. O resultado é:Em outras palavras, o último token bruto sem espaço em branco
a{b,c}
do comando anterior é inserido, em vez do item semânticoac
. Isso parece mais um recurso do GNU Readline do que um recurso do GNU Bash.Eu uso frequentemente no combo