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?

Wuffers
fonte

Respostas:

38

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.

Veja também este post de Michael Mrozek no Unix Stack Exchange .

Gilles 'SO- parar de ser mau'
fonte
1
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.

Benoit
fonte
Eu quase nunca uso pontos de exclamação nos comandos. Portanto, o método do ponto de exclamação funciona perfeitamente para mim.
Wuffers 17/11/2010
Então aproveite. Muitos dos inúmeros recursos do seu shell foram projetados para apenas alguns usuários.
Benoit
Na verdade, você não precisa escapar dos pontos de exclamação. Faça echo 'Hello, orld!'. Observe as aspas simples em vez das duplas.
Wuffers 30/11/10