Apenas querendo saber por que isso não está funcionando
#!/bin/bash
ls /bin
ls !$
Espero executar ls /bin
duas vezes, mas o segundo gera erros, pois !$
não foi interpretado
Perdi alguma coisa, ou !$
apenas trabalhei na linha de comando?
Não encontrei parte relevante em man bash
(no mac)
Respostas:
O histórico e a expansão do histórico são desativados por padrão quando o shell é executado de maneira não interativa.
Você precisa:
ou:
isso afetará todas as instâncias do bash que
script.sh
podem ser executadas.fonte
bash
que é executadoscript.sh
, mas também todas as outrasbash
instâncias quescript.sh
podem ser executadas (como outrosbash
scripts ...).bash
instância que execute seu script.A melhor coisa a fazer seria
ou
ou
Advertências: vale lembrar que cada uma delas traz algumas armadilhas. A solução $ _ captura apenas o último argumento único: assim
ls foo bar
, $ _ contém apenasbar
. A uma usandoset
vai substituir os argumentos ($1
,$2
, etc.). E tudo isso, conforme escrito, funcionará, mas quando generalizado para comandos mais complexos (onde escape e espaço em branco são importantes), você pode encontrar algumas dificuldades. Por exemplo:ls 'foo bar'
(onde o argumento do nome do caminho únicofoo bar
contém dois ou mais espaços ou qualquer outro caractere de espaço em branco) não se comportará corretamente em nenhum desses exemplos. Uma fuga adequada (possivelmente combinada com umeval
comando), ou o uso em"$@"
vez de$*
, pode ser necessária para contornar esses casos.fonte
$_
caminho não é portátil, você está certo. Aset
abordagem funciona em um traço não interativo, e com o${1+"$@"}
truque (mais zsh global alias) deve ser geral, embora eu me lembre vagamente queset
tem um histórico de não ser perfeitamente portátil com alguns shells (antigos?). A abordagem definir-uma-variável-segurando-o-comando-e-depois-avaliar-ele, especialmente usando escape apropriado e umeval
comando real , é completamente portátil, até onde eu sei.