web-dev-qa-db-ja.com

Bashの最後のコマンドからの出力を再利用する

Bashコマンドの出力はレジスタに格納されていますか?例えば。終了ステータスの代わりに$?が出力を取得するのと似たようなものです。

出力を変数に代入することができます:

output=$(command)

しかし、それはもっとタイピングです...

127
memecs

これを使用することができます:最後のコマンドの出力を再計算するために$(!!)を再利用します。

!!は単独で最後のコマンドを実行します。

$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre
135
ling

答えはノーだ。 Bashは、メモリ上のパラメータやブロックに出力を割り当てません。また、あなたはその許可されたインターフェース操作によってのみBashにアクセスすることが許可されています。 Bashの個人データは、ハッキングしない限りアクセスできません。

75
konsolebox

その1つの方法はtrap DEBUGを使うことです。

f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG

最近実行されたコマンドの標準出力と標準エラー出力が/tmp/out.logで利用可能になります。

唯一の欠点は、コマンドを2回実行するということです。1回は出力をリダイレクトし、errorを/tmp/out.logにリダイレクトし、もう1回は通常です。おそらくこの振る舞いを防ぐ方法もあります。

8
anubhava

Macを使用していて、変数に書き込む代わりに出力をクリップボードに保存しても構わない場合は、回避策としてpbcopyとpbpasteを使用できます。

例えば、ファイルを見つけてその内容を別のファイルと比較するためにこれを行う代わりに、

$ find app -name 'one.php' 
/var/bar/app/one.php

$ diff /var/bar/app/one.php /var/bar/two.php

あなたはこれをすることができます:

$ find app -name 'one.php' | pbcopy
$ diff $(pbpaste) /var/bar/two.php

最初のコマンドを実行すると、文字列/var/bar/app/one.phpがクリップボードに表示されます。

ちなみにpbcopypbpastepbはクリップボードのペーストボード、クリップボードの同義語です。

4
Raghu Dodda

Anubhavaの答えに触発された、それは私がそれが各コマンドを2回実行するので実際には受け入れられないと思う。

save_output() { 
   exec 1>&3 
   { [ -f /tmp/current ] && mv /tmp/current /tmp/last; }
   exec > >(tee /tmp/current)
}

exec 3>&1
trap save_output DEBUG

この方法では、最後のコマンドの出力は/ tmp/lastにあり、コマンドは2回呼び出されません。

3
olivecoder

Konsoleboxが言ったように、bash自体に侵入する必要があります。 ここ はこれをどのように達成できるかについての非常に良い例です。 stderredリポジトリ(実際にはstdoutを色付けするためのものです)は、それを構築する方法についての指示を与えます。

試してみました:.bashrcの中に新しいファイル記述子を定義するように

exec 41>/tmp/my_console_log

内容はfd 41にも書き込まれるようにstderred.cを修正してください。 のような は動作しますが、NULバイトのロード、奇妙なフォーマットを含み、基本的にはバイナリデータで、読み取り不可能です。 Cをよく理解している人なら、それを試してみることもできます。

もしそうなら、最後の印刷行を取得するために必要なすべてはtail -n 1 [logfile]です。

1
Blauhirn

すぐに実装しようとする時間がないという考えがあります。

しかし、次のようなことをしたらどうなるでしょう。

$ MY_HISTORY_FILE = `get_temp_filename`
$ MY_HISTORY_FILE=$MY_HISTORY_FILE bash -i 2>&1 | tee $MY_HISTORY_FILE
$ some_command
$ cat $MY_HISTORY_FILE
$ # ^You'll want to filter that down in practice!

IOバッファリングに問題がある可能性があります。ファイルが大きくなりすぎる可能性もあります。これらの問題に対する解決策を考え出す必要があります。

0
William Navarre

あなたがこれが何を必要としているのか正確にはわからないので、この答えは関係ないかもしれません。あなたはいつでもコマンドの出力を保存することができます:netstat >> output.txt、しかし私はあなたが探しているのではないと思います。

もちろんプログラミングのオプションもあります。そのコマンドが実行された後に上記のテキストファイルを読み、それを変数に関連付けるプログラムを取得することができます。そして私が選んだ言語Rubyでは、 'backticks'を使ってコマンド出力から変数を作成できます。

output = `ls`                       #(this is a comment) create variable out of command

if output.include? "Downloads"      #if statement to see if command includes 'Downloads' folder
print "there appears to be a folder named downloads in this directory."
else
print "there is no directory called downloads in this file."
end

これを.rbファイルに貼り付けて実行します。Ruby file.rbを実行すると、コマンドから変数が作成され、それを操作できるようになります。

0
user4493605