Shell: Como faço para obter o último argumento do comando anterior quando ele foi desanexado?

3

Dentro do shell, digitar ALT+. ou usando !$ chama novamente o último argumento passado do comando anterior. Eu uso isso o tempo todo, mas como você faz isso quando desanexou o comando anterior?

$ do-something foo a_long_file_name &

Como obtenho a_long_file_name no prompt e não noe comercial?

    
por BertS 16.06.2013 / 21:28

4 respostas

3

\e-\e. (ou pressionando - e . , enquanto alt / opção segurando) insere o segundo última palavra.

Da mesma forma, \e-2\e. insere o terceiro última palavra, e \e2\e. insere a terceira palavra.

    
por 16.06.2013 / 22:05
3

Usando a expansão do histórico, você pode acessar as palavras do comando anterior com !:n , em que n inicia em 0 com o nome do comando. !^ é equivalente a !:1 . Nesse caso, você quer !:2

$ echo foo bar &
[1] 10750
foo bar
$ echo !:2
echo bar
bar
[1]+  Done                    echo foo bar
    
por 16.06.2013 / 22:45
2

Você faz $_ .

echo 'hey there' &
echo "$_"

OUTPUT

hey there
hey there
    
por 17.08.2014 / 07:49
1

As respostas de glenn e Lauri estão corretas, mas elas exigem muita digitação do IMO. Finalmente, surgiu a seguinte solução: C-j looping através dos argumentos do comando anterior (excluindo o e comercial), do último para o primeiro. Isso é muito prático! Aqui está como fazer isso:

Escreva o seguinte script:

#!/bin/bash

cj_hist=$(builtin history | tail -n1)
cj_num=$(cut -f1 -d\  <<< $cj_hist)

if [[ $cj_old_num -eq $cj_num ]]
then
  cj_killw='\x17'
else
  cj_args=$(cut -f3- -d\  <<< $cj_hist)
  cj_args=${cj_args%&}
  cj_args=($cj_args)
  cj_cnt=0
  cj_killw=''
fi

[[ $cj_cnt -le 0 ]] && cj_cnt=${#cj_args[*]}
let cj_cnt--

if [[ $cj_cnt -eq -1 ]]
then
  bind '"\ez":""'
  # bind -m vi-insert '"\C-o":""'
else
  bind '"\ez":"'$cj_killw${cj_args[$cj_cnt]}'"'
  # bind -m vi-insert '"\C-o":"'$cj_killw${cj_args[$cj_cnt]}'"'
fi

cj_old_num=$cj_num

Coloque isso no seu ~ / .bashrc:

 bind -x '"\ew": source ~/foo.sh'  # ~/foo.sh is the script's path
 bind '"\C-j":"\ew\ez"'
 # bind -x '"\C-h": source ~/foo.sh'      # vi-users: no mess
 # bind -m vi-insert '"\C-j":"\C-h\C-o"'  # with escapes

NB: Uma vez que nós fornecemos o script, temos que usar nomes de variáveis que não são comumente usados, daí o prefixo cj_ . Claro, você pode usar outro prefixo.

    
por 17.06.2013 / 11:36