Shell:切り離したときに前のコマンドの最後の引数を取得する方法は?

Shell:切り離したときに前のコマンドの最後の引数を取得する方法は?

シェルで前のコマンドを呼び出す最後に渡された引数を入力またはALT+.使用します。!$これはいつも使用していますが、前の命令を削除するとどうなりますか?

$ do-something foo a_long_file_name &

a_long_file_nameアンパサンドの代わりにヒントを取得する方法は?

答え1

\e-\e.(またはalt / optionを押しながら-.最後の単語から2番目の単語を挿入します。

同様に\e-2\e.、最後から3番目の単語を挿入してから\e2\e.3番目の単語を挿入します。

答え2

履歴拡張機能を使用すると、前のコマンドの単語にアクセスできます。ここで、!:nnはコマンド名で0から始まります。この場合!^!:1!:2

$ echo foo bar &
[1] 10750
foo bar
$ echo !:2
echo bar
bar
[1]+  Done                    echo foo bar

答え3

あなたは$_

echo 'hey there' &
echo "$_"

出力

hey there
hey there

答え4

GlennとLaurieの答えは正確ですが、私の意見では入力が多すぎます。最後に、私は次の解決策を思い出しました。C-j前のコマンドの引数(アンパサンドを除く)を最後から最初に繰り返します。これは非常に実用的です!実行方法は次のとおりです。

次のbashスクリプトを作成します。

#!/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

これを〜/.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

注:スクリプトをインポートしているため、一般的ではない変数名を使用する必要があるため、プレフィックスcj_。もちろん、他のプレフィックスを使用することもできます。

関連情報