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


29

bashシェルを使用して分析を実行しているとき、よく使用するコマンドを同じディレクトリ内のファイル(「LOGBOOK」と呼ばれる)に保存して、何を確認できるようにします。私はそれらの結果を取得しました。これまでのところ、これは、端末からコマンドをコピーして貼り付けるか、コマンドを "up"に押してコマンドをに変更するecho"my command" >> LOGBOOKか、他の同様のふざけを意味します。

history先日、ツールがあることに気付きましたが、以前に実行したコマンドを取得するためにそれを使用する方法が見つからないため、次のようなことができますgetlast >> LOGBOOK

これを行うための素敵な簡単な方法はありますか。あるいは、他の人は、結果を得るためにコマンドを保存することにどのように対処しますか?

回答:


37

あなたが使用している場合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することができ、別のコマンドを実行する前に保存を忘れた場合でも、コマンドの最後のインスタンスを簡単に保存できます。引数を渡さない場合getlast(つまり、fcasを呼び出すとfc -ln "" ""、最後のコマンドのみが出力されます)。

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


5
最初の形式fc -lnr | head -n 1はに短縮できますfc -lnr -1
ブラム

@Bram:良いもの。help fcドキュメントに使用していました。bashのmanページには、このような負のインデックスの使用を含む詳細があります。head残っている1つのコマンドが組み込まれているため、除去は適切であり、フォーク/ execはありません。
-camh

1
コマンドが呼び出された理由を私は不思議fc...
IMZ -イワンZakharyaschev

2
「修正コマンド」の略です。 gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel

9

@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
有効にするcmdhistことを修正します:「セットは、bashの試みは、同じ履歴エントリに複数行のコマンドのすべての行を保存する場合、これは簡単に複数行のコマンドの再編集ができます。」
マークマッキンストリー

2

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

例えば

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

注:これはリテラルテキストを引用しません


5
それはリテラルコマンドをキャプチャしません。シェルのメタキャラクターがある場合、それらは評価され、置換されます。パイプラインも壊れます:ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK
-camh

0

bashシェルを使用している場合は、次のコマンドでそれを行うことができます。

$> history -a LOGBOOK

これにより、現在のセッションのすべてのコマンドがそのファイルに追加されます。〜/ .bashrcファイルにエイリアスを追加して、1つのコマンドでこれを行うこともできます。

$> alias getlast="history -a LOGBOOK"

1
しかし、機能していて結果が得られたコマンドのみを保存するというより重要な要件がありません。最近行ったコマンドをすべて保存するのではなく、使用したコマンドを選択するだけです。とにかくありがとう。
MattLBeck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.