Como posso obter um argumento específico de um comando anterior no bash?
31
No bash, você pode usar !*para obter todos os argumentos do comando anterior. Como exemplo, se você fez cp /some/path /some/other/pathe fez mv !*, o segundo comando seria expandido para mv /some/path /some/other/path.
Existe algo assim que pode ser usado para acessar um argumento específico de um comando em vez de todos eles?
In !*, !é o prefixo de expansão do histórico e *é o designador da palavra que significa todos os argumentos. Você pode memorizar a sintaxe geral como bang-line-colon-column ( coluna de !linha :). Existem muitos atalhos possíveis: a linha padrão é a linha anterior, o especificador de coluna padrão é "todos" e você pode deixar dois pontos se o especificador de coluna não for numérico (mas !3significaria a linha 3). Você pode usar !:0para se referir ao nome do comando, !:1, !:2, etc, para se referir a argumentos sucessivos, !:$para a última palavra, !:*para todos os argumentos, e muito mais.
Eu tentei eu mesmo e isso não funcionou, no entanto. Depois de olhar para o cargo por Michale Mrozek, ele diz para usar !:1, !:2. Depois de usar a versão com dois pontos, funcionou.
Wuffers 14/11/10
@ MrMan: Opa, certo, se você deixar os dois pontos com um número, o número será interpretado como um número de linha. Me desculpe por isso.
Gilles 'SO- stop be evil'
Sem problemas. Então, suponho que fazer !1:1apontaria para o primeiro argumento da primeira linha?
Wuffers
4
Pessoalmente, eu realmente não gosto desse recurso de "expansão com ponto de exclamação", que até atrapalha se você tentar echo "Hello World!"em shells interativos (portanto, os scripts de fornecimento que pressupõem que eles serão executados no modo não interativo não funcionarão de todo).
Então, defino set +o histexpande começo a recuperar argumentos com o seguinte método:
Esc,1,Esc,Ctrl-Y =>Insert first argument of previous command.
Observe que o truque Esc é porque eu não tenho uma meta-chave.
!:1
,!:2
. Depois de usar a versão com dois pontos, funcionou.!1:1
apontaria para o primeiro argumento da primeira linha?Pessoalmente, eu realmente não gosto desse recurso de "expansão com ponto de exclamação", que até atrapalha se você tentar
echo "Hello World!"
em shells interativos (portanto, os scripts de fornecimento que pressupõem que eles serão executados no modo não interativo não funcionarão de todo).Então, defino
set +o histexpand
e começo a recuperar argumentos com o seguinte método:Observe que o truque Esc é porque eu não tenho uma meta-chave.
fonte
echo 'Hello, orld!'
. Observe as aspas simples em vez das duplas.