web-dev-qa-db-ja.com

zshは最後に実行されたプログラムのstdoutにアクセスできますか?

私はしばしばfindまたはlocateを使用してパスについて調べます。

(~) locate foobar.mmpz
/home/progo/lmms/projects/foobar.mmpz

多くの場合、次のステップはファイルを開くか、操作します。上記のような幸せなケースでは、これを行うことができます:

(~) ls `!!`
ls `locate foobar.mmpz`
/home/progo/lmms/projects/foobar.mmpz

しかし、出力の行が多く、その一部がパスまたはその種の他のものではない可能性がある場合、誰もが満足しています。その上、無駄になる可能性のあるコマンドを再実行することも、それほどエレガントではありません。

後で操作するためにzdをフックしてstdoutを配列に格納する方法はありますか?結局のところ、ストリームをユーザーにリダイレクトするのはシェルの仕事です。 $?などのように、最初のN行と最後のN行をすぐに後で使用できるように変数に格納できると思います。

OKしたがって、これはかなりクールです https://unix.stackexchange.com/a/59704/5674 。私は今、zshのノウハウ(およびコードをzshに移植)について尋ねて、各実行行の後にこの種のキャプチャをリギングしています。

16
nperson325681

私はこの中途半端な解決策を思いつきました:

alias -g ___='"$(eval "$(fc -ln -1)" | tail -n 1)"'

これにより、コマンドラインの任意の時点で___を書き込むことができます。前のコマンドが再実行され、___がその出力の最後の行に置き換えられます。使用例:

$ touch foo bar baz
$ ls -1
bar
baz
foo
$ vim ___

最後のコマンドはvim fooに展開されます。

これには鋭いエッジがあります!

  • コマンドに___を含め、前のコマンドにも___を含めた場合、シェルはしばらく変な状態でハングします。あなたはすぐにこの状態から抜け出すことができます Ctrl-C

  • 押すこともできません Tab___やその他の構造と同様に、!$を拡張します。

  • 一部のコマンドは、「正常に」実行された場合とパイプに接続された場合に異なる出力を表示します。 (lsls | catの出力を比較してください。)___によってトリガーされたコマンドがこれらの1つである場合、予期しないコマンドが実行される可能性があります。

  • もちろん、最後の出力ライン以外の出力ラインで何かを実行したい場合、これは役に立ちません。

___という名前を選んだのは、これを引数としてではなく、Wordとしてコマンドラインに含めたくなかったからです。別の名前を選択することもできますが、誤って拡張される可能性のあるものを選択しないように注意してください。

2
bdesham