2016-12-03 6 views
2

の場合、manual says$_は "最後に実行されたコマンドの最後の引数"にする必要があります。ここ

は、予想される動作である:

$ echo 1 2 3 
1 2 3 
$ echo $_ 
3 
$ 

DEBUGトラップを使用して、$_むしろユーザが入力した最後のコマンドよりも(以下の例でdate)トラップによって実行最後のコマンドに基づいています。

$ exec bash 
$ unset PROMPT_COMMAND 
$ trap date DEBUG 
$ echo 1 2 3 
Sat Dec 3 11:54:33 ICT 2016 
1 2 3 
$ echo $_ 
Sat Dec 3 11:54:37 ICT 2016 
date 
$ # User blinks in confusion and says "but I didn't just type date!" 

デフォルトでは、DEBUGトラップを設定すると$_のデフォルトの動作を変更するようです。

chrubybash-preexecの両方にこの問題があります。

zshで期待どおりに興味深いことに、この作品:

$ zsh 
genesis% trap date DEBUG 
genesis% echo 1 2 3 
Sat Dec 3 12:18:01 ICT 2016 
1 2 3 
genesis% echo $_ 
Sat Dec 3 12:18:04 ICT 2016 
3 
genesis% 

DEBUGトラップを使用したとき、どのように私は$_の値を保持することができますか?

答えて

4

「最後に実行されたコマンドの最後の引数」には、「ユーザーが最後に入力したコマンド」ではなく、「最後に実行されたコマンド」というリテラルテキストが含まれています。 bashはこの点でドキュメントが約束しているように動作しています。

しかし、気にしない:あなたのトラップは、これまで非ゼロ値(したがって、彼らは前に実行中止命令)を返すされていない限り、これは回避するのは簡単です:

trapfunc() { local old_=$1; date; : "$old_"; } 
trap 'trapfunc "$_"' DEBUG 
+0

あなたは '$ 1引用していない任意の理由を'? –

+2

@TomHaleパラメータの展開と単語分割は代入では起こりません: 'a = 'hello world * .txt'; b = $ a''b'は上手です。 – andlrc

関連する問題