私はしばしば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に移植)について尋ねて、各実行行の後にこの種のキャプチャをリギングしています。
私はこの中途半端な解決策を思いつきました:
alias -g ___='"$(eval "$(fc -ln -1)" | tail -n 1)"'
これにより、コマンドラインの任意の時点で___
を書き込むことができます。前のコマンドが再実行され、___
がその出力の最後の行に置き換えられます。使用例:
$ touch foo bar baz
$ ls -1
bar
baz
foo
$ vim ___
最後のコマンドはvim foo
に展開されます。
これには鋭いエッジがあります!
コマンドに___
を含め、前のコマンドにも___
を含めた場合、シェルはしばらく変な状態でハングします。あなたはすぐにこの状態から抜け出すことができます Ctrl-C。
押すこともできません Tab___
やその他の構造と同様に、!$
を拡張します。
一部のコマンドは、「正常に」実行された場合とパイプに接続された場合に異なる出力を表示します。 (ls
とls | cat
の出力を比較してください。)___
によってトリガーされたコマンドがこれらの1つである場合、予期しないコマンドが実行される可能性があります。
もちろん、最後の出力ライン以外の出力ラインで何かを実行したい場合、これは役に立ちません。
___
という名前を選んだのは、これを引数としてではなく、Wordとしてコマンドラインに含めたくなかったからです。別の名前を選択することもできますが、誤って拡張される可能性のあるものを選択しないように注意してください。