Como posso obter um argumento específico de um comando anterior no bash?

30

No bash, você pode usar !* para obter todos os argumentos do comando anterior. Por exemplo, se você usou cp /some/path /some/other/path e, em seguida, 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?

    
por Wuffers 15.11.2010 / 00:12

2 respostas

36

Em !* , ! é o prefixo expansão do histórico e * é o designador de palavras que significa todos os argumentos. Você pode memorizar a sintaxe geral como bang-line-colon-column (coluna ! line : ). Existem muitos atalhos possíveis: a linha padrão é a linha anterior, o especificador de coluna padrão é "all" e você pode deixar os dois pontos se o especificador de coluna não for numérico (mas !3 significaria a linha 3). Você pode usar !:0 para se referir ao nome do comando, !:1 , !:2 , etc, para se referir a argumentos sucessivos, !:$ para a última palavra, !:* para todos os argumentos e mais.

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

    
por 15.11.2010 / 00:23
4
Pessoalmente, eu realmente não gosto desse recurso de "expansão com ponto de exclamação" que vai até atrapalhar se você tentar echo "Hello World!" em shells interativos (então, os scripts de origem que assumem que eles serão executados no modo não interativo não funcionarão de forma alguma) ).

Por isso, defino set +o histexpand e começo a recuperar argumentos com o seguinte método:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Note que o Esc-truque é porque eu não tenho uma meta-chave.

    
por 15.11.2010 / 07:30