「履歴」はbashスクリプト内で実行すると機能しなくなります


9

特定の文字列を見つけるためにbashの履歴をgrepする簡単なスクリプトを書いています。コマンドラインで、次のように実行できます。これは正常に機能します。

history | grep git

しかし、上記と同じコマンドでbashスクリプトを作成すると、突然history何も返されません。

#!/bin/bash
history | grep git

最初の行を削除する#!/bin/bashと、スクリプトが再び動作します。ここで何が起きてるの?historybashスクリプト内でどのように使用できますか?

回答:


8

以下はのためのものbash 4.0 or higher onlyですが、それはトリックを行います。:)

#!/bin/bash -i
history | grep sometext

動作します!やってみて。(-i= i nteractive、bash 3.x以前で使用できないフラグ)


彼ができるという理由だけで最近私に反対票を投じた男にも感謝します。(おそらくbash欲求不満から、おそらくv3ユーザー、笑)。少なくともマーティンにとって私の解決策は非常に役立ちました。それは(少なくとも)快適です。
syntaxerror

24時間年中無休のサポートエンジニアの勤務時間外の作業を記録するツールを作成しているときにも、同じ質問がありました。ありがとうございます。
Henry van Megen

14

たとえば、shebang行がである実行可能ファイルを実行してbashシェルスクリプトを実行する#!/bin/bashと、スクリプトは非インタラクティブシェルで実行されます。非対話型シェルの機能の1つは、履歴が無効になっていることです。そのため、スクリプトで履歴を使用できるようにするには、次のようにする必要があります。

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

もちろん、この場合は次のようにすることができます。

grep git ~/.bash_history

上記の両方で履歴ファイル(~/.bash_history)が最新であることを必要とするため、ほぼ確実に最新ではありません。

シバン行が削除された後、スクリプトをどのように実行するかわかりません。ファイルをソーシング(例えば、とのこと.)ではない歴史を持っている現在のシェルで実行するコマンドは、有効になっているので、スクリプトを実行するのと同じ。


history -a最後のコマンドが最初にファイルに追加されることを確認するために、setコマンドの直後に何をしますか?

4
@illuminÉ:役に立たない。スクリプトの実行を開始したシェルは、まったく異なるプロセスです。それはfrsh空の歴史から始まります。
rici
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.