web-dev-qa-db-ja.com

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

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

先日、historyツールがあることがわかりましたが、以前に実行したコマンドを取得してgetlast >> LOGBOOKのようなことができるようにするためのツールが見つかりません。

これを行う簡単な方法はありますか?または、他のユーザーは、コマンドの結果を保存するためにどのように対処しますか?

32
MattLBeck

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

fc -ln -1

最後のコマンドが出力されます。 -lはリストを意味し、-nは行にコマンド番号をプレフィックスしないことを意味し、-1は最後のコマンドのみを表示することを意味します。行の先頭の空白(複数行コマンドの最初の行のみ)が煩わしい場合は、sedを使用して簡単に削除できます。それをシェル関数にすると、要求に応じて解決策が得られます(getlast >> LOGBOOK):

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

それはあなたがあなたの質問で尋ねたように機能するはずです。

fcコマンドに"$1" "$1"を追加して、わずかなバリエーションを追加しました。これにより、たとえば、getlast mycommandと言って、mycommandを呼び出す最後のコマンドラインを出力できます。そのため、別のコマンドを実行する前に保存するのを忘れた場合でも、最後のインスタンスを簡単に保存できます。コマンド。 getlastに引数を渡さない場合(つまり、fcfc -ln "" ""として呼び出すと、最後のコマンドのみが出力されます)。

[注:@Bramのコメントと@glenn jackmanの回答で言及されている問題を考慮して編集された回答。]

42
camh

@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"
10
glenn jackman

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

例えば.

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

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

2
ryanbraganza

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

$> history -a LOGBOOK

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

$> alias getlast="history -a LOGBOOK"
0
stringbasic