最後のコマンドをファイルに保存するにはどうすればよいですか?

最後のコマンドをファイルに保存するにはどうすればよいですか?

Bashシェルを使用して分析を実行するときに良い結果を与えるコマンドを同じディレクトリ(名前で「LOGBOOK」)のファイルに保存して、私がどのコマンドを実行したかを確認できることがよくあります。このような結果を得るためにこうしました。これまでは、端末からコマンドをコピーして貼り付けたり、「上」を押してコマンドをに変更したり、他の同様echo"my command" >> LOGBOOKのいたずらを意味します。

以前はツールがあることがわかりましたがhistory、以前に実行したコマンドをインポートしてそのようなタスクを実行する方法を見つけることができませんでしたgetlast >> LOGBOOK

これを行う良い簡単な方法はありますか?それとも、他の人は自分が得た結果を保存するコマンドをどのように処理しますか?

答え1

を使用している場合は、bash次のfcコマンドを使用して希望の方法で履歴を表示できます。

fc -ln -1

これにより、最後のコマンドが印刷されます。-lリストを示し、-nコマンド番号を行プレフィックスとして使用しないことを示し、最後のコマンドのみが表示されることを-1示します。行の先頭の空白(複数行のコマンドの最初の行のみ)が面倒な場合は、簡単に削除できますsed。これをシェル関数に置き換えることで、要求された解決策を得ることができます(getlast >> LOGBOOK)。

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

質問に応じて動作します。

"$1" "$1"コマンドに追加していくつかの変更を追加しましたfc。たとえば、最後にgetlast mycommand呼び出されたコマンドラインを印刷できるmycommandため、他のコマンドを実行する前に保存するのを忘れた場合でも、コマンドの最後のインスタンスを簡単に保存できます。引数を渡さないとgetlastfcasを呼び出すと、fc -ln "" ""最後のコマンドだけが印刷されます)

[注:@Bramのコメントと@glenn jackmanの回答に記載されている問題を説明するために回答を編集しました。 ]

答え2

@camhの答えに対する1つの問題は、複数行にまたがるコマンドがある場合は最初の行だけが表示されることです。

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

この試み:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

答え3

"!!"上矢印を使用する代わりに、を使用して前のコマンドを参照できます。

例えば

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

注:テキストは引用しません。

答え4

fc -l | awk 'FNR == 15 {print $2}' > /tmp/last_command

私はawkを使ってfc -l出力から最後のコマンドをキャプチャし、/tmp/last_commandに出力します。

関連情報