Bashコマンドの出力はレジスタに格納されていますか?例えば。終了ステータスの代わりに$?
が出力を取得するのと似たようなものです。
出力を変数に代入することができます:
output=$(command)
しかし、それはもっとタイピングです...
これを使用することができます:最後のコマンドの出力を再計算するために$(!!)
を再利用します。
!!
は単独で最後のコマンドを実行します。
$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre
答えはノーだ。 Bashは、メモリ上のパラメータやブロックに出力を割り当てません。また、あなたはその許可されたインターフェース操作によってのみBashにアクセスすることが許可されています。 Bashの個人データは、ハッキングしない限りアクセスできません。
その1つの方法はtrap DEBUG
を使うことです。
f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG
最近実行されたコマンドの標準出力と標準エラー出力が/tmp/out.log
で利用可能になります。
唯一の欠点は、コマンドを2回実行するということです。1回は出力をリダイレクトし、errorを/tmp/out.log
にリダイレクトし、もう1回は通常です。おそらくこの振る舞いを防ぐ方法もあります。
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
がクリップボードに表示されます。
ちなみにpbcopy
とpbpaste
のpbはクリップボードのペーストボード、クリップボードの同義語です。
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回呼び出されません。
Konsoleboxが言ったように、bash自体に侵入する必要があります。 ここ はこれをどのように達成できるかについての非常に良い例です。 stderredリポジトリ(実際にはstdoutを色付けするためのものです)は、それを構築する方法についての指示を与えます。
試してみました:.bashrc
の中に新しいファイル記述子を定義するように
exec 41>/tmp/my_console_log
内容はfd 41にも書き込まれるようにstderred.c
を修正してください。 のような は動作しますが、NULバイトのロード、奇妙なフォーマットを含み、基本的にはバイナリデータで、読み取り不可能です。 Cをよく理解している人なら、それを試してみることもできます。
もしそうなら、最後の印刷行を取得するために必要なすべてはtail -n 1 [logfile]
です。
すぐに実装しようとする時間がないという考えがあります。
しかし、次のようなことをしたらどうなるでしょう。
$ 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バッファリングに問題がある可能性があります。ファイルが大きくなりすぎる可能性もあります。これらの問題に対する解決策を考え出す必要があります。
あなたがこれが何を必要としているのか正確にはわからないので、この答えは関係ないかもしれません。あなたはいつでもコマンドの出力を保存することができます: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
を実行すると、コマンドから変数が作成され、それを操作できるようになります。