it-swarm-ja.tech

bashスクリプト内の履歴コマンド

履歴はシェルに組み込まれたコマンドであり、BASHスクリプト内では使用できませんでした。それで、BASHスクリプトを使用してこれを達成する方法はありますか?
ここでは、私のスクリプトを紹介します。

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]
20

Bashはデフォルトで非インタラクティブシェルの履歴を無効にしますが、有効にすることができます。

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …

ただし、そのサーバーのアクティビティを監視しようとしている場合、シェルの履歴は役に立ちません(履歴に表示されないコマンドを実行するのは簡単です)。 Linuxですべてのプロセスの起動をログに記録するにはどうすればよいですか を参照してください。

スクリプトをデバッグしている場合、シェルの履歴は有用な情報を取得するための最良の方法ではありません。はるかに優れたツールは、デバッグトレース機能です:put set -xスクリプトの上部近く。トレースは標準エラーに書き込まれます。

非対話的に実行するときに実際に履歴機能を使用するかどうかはわかりません。そうしないと、実行するすべてのシェルスクリプトによってコマンド履歴が乱雑になります。

ソース${HOME}/.bash_historyに直接移動しないのはなぜですか。history | tail -100tail -100 ${HOME}/.bash_historyに置き換えます。 (タイムスタンプを使用する場合、おそらくgrep -v ^# ${HOME}/.bash_history | tail -100に沿って何かを行う必要があります)。

6

スクリプトでアクティブなシェルセッションからのhistoryコマンドの出力を使用する場合は、エイリアスを使用して最初にコマンドを実行できます。次に、同じエイリアスで、スクリプトの残りの部分を呼び出すことができます。このような構成では、実際のスクリプトにhistoryコマンドを含めるのと基本的に同じ結果を得ることができます。

たとえば、スクリプトの名前をscript.shとすると、次のようなエイリアスを作成できます。

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

スクリプトを次のように変更します。

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]

2つのコンピューターで~/bash_historyファイルを結合、並べ替え、同期するプロセスを作成しているときにこの質問を見つけたので、過去に使用したコマンドを簡単に検索できます。

~/bash_historyを更新するために新しいシェルにログインしなくても、累積履歴ファイルを更新する手間が大幅に軽減されます。他の回答で述べたように、サーバーを監視する場合、これは明らかに機能しません。

特に私の使い方は:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

スクリプトhby.shは、すべての~/.bash_history*ファイルからすべての一意のエントリをプルします。

2
clk

組み込みの履歴がシェルスクリプト内で無効になっているようです。ここを参照してください: http://www.tldp.org/LDP/abs/html/histcommands.html

これに関する公式のドキュメントは見つかりませんでした。

2
lesmana

Bashスクリプトでは、historyコマンドはデフォルトで無効になっているため、historyコマンドでも.shファイルでは機能しません。リダイレクトのために、親切にbash_historyファイルを.shファイル内にリダイレクトしてください。

または履歴メカニズムを有効にするには、履歴ファイルを参照して、以下に示すようにランタイムパラメータを変更します。

#!/bin/bash
HISTFILE=~/.bash_history
set -o history 

注:上記のスクリプトファイルの上部にある2行です。履歴コマンドが履歴で機能するようになりました。

1
linux.cnf

以下のようにscript.shという名前のスクリプトを作成します。 Xという名前のスクリプトを作成し、Y履歴の行数をその中に入れます。

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive Shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

次に、最後の14行で作業していた「task」という名前のタスクを実行するスクリプトを作成する場合

script.sh task 14

次に、履歴をクリーンアップして、Niceスクリプトを作成します。

1
Eric

すべてのユーザーは、historyコマンドの結果である独自の履歴ファイルを持っています。シェルスクリプトでhistoryコマンドを使用する代わりに、ユーザーの履歴ファイルを使用できます。 .bash_historyユーザーのホームディレクトリにあるファイル。これはユーザーの履歴ファイルになります。

0
amit singh