履歴はシェル組み込みコマンドであり、BASHスクリプト内で使用できませんでした。だから、BASHスクリプトを使用してこれを達成する方法はありますか?
ここで、私のスクリプトを紹介します。
#!/bin/bash
history | tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt | mail -s "History log of server" hello@hel.com
履歴はシェル組み込みコマンドであり、BASHスクリプト内で使用できませんでした。だから、BASHスクリプトを使用してこれを達成する方法はありますか?
ここで、私のスクリプトを紹介します。
#!/bin/bash
history | tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt | mail -s "History log of server" hello@hel.com
回答:
Bashはデフォルトで非対話型シェルの履歴を無効にしますが、有効にすることができます。
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …
ただし、そのサーバー上のアクティビティを監視しようとしている場合、シェルの履歴は役に立ちません(履歴に表示されないコマンドを実行するのは簡単です)。Linuxでのすべてのプロセス起動をログに記録するにはを参照してください。
スクリプトをデバッグしている場合、シェル履歴は有用な情報を取得する最良の方法ではありません。はるかに優れたツールは、デバッグトレース機能ですset -x
。スクリプトの先頭近くに配置します。トレースは標準エラーに書き込まれます。
sh
、エラーメッセージの正確な文言でダッシュジャッディングしています)。bashの履歴にアクセスするには、bash(#!/bin/bash
またはで始まるスクリプト#!/usr/bin/env bash
)を使用する必要があります。
Illegal option
(言うでしょうset: history: invalid option name
)。
set -o history
、その後のようなエントリで詰まっれようとしている歴史にif [...
vars=$(...
など
set -x
は、はるかに便利です。
非対話型で実行するときに実際に履歴機能を使用するかどうかはわかりません。そうしないと、実行するすべてのシェルスクリプトがコマンド履歴を乱雑にします。
ソースに直接行かないのはなぜ${HOME}/.bash_history
、交換してくださいhistory | tail -100
とtail -100 ${HOME}/.bash_history
。(タイムスタンプを使用する場合、おそらくの行に沿って何かをする必要がありますgrep -v ^# ${HOME}/.bash_history | tail -100
)。
greq -v '^#[0-9]\+$'
(シェルでコメントを「実行」することがあります...)
history
ますが、grep
メソッドの出力とメソッドの出力には違いがあります...
history -a; history -c; history -r
。(追加、クリア、読み取り)
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" hello@hel.com
~/bash_history
2台のコンピューターでファイルを結合、並べ替え、同期するプロセスを書いているときにこの質問を見つけたので、過去に使用したコマンドを簡単に検索できます。
更新するために新しいシェルにログインしなくても、累積履歴ファイルを更新するのは面倒ではありません~/bash_history
。サーバーを監視する場合、他の回答で述べたように、これは明らかに機能しません。
特に私の使用法は次のとおりです。
alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh
スクリプトhby.sh
は、すべての~/.bash_history*
ファイルからすべての一意のエントリをプルします。
履歴ビルトインはシェルスクリプト内で無効になっているようです。こちらをご覧ください:http : //www.tldp.org/LDP/abs/html/histcommands.html
私はこれに関する公式文書を見つけていません。
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
次に、履歴をクリーンアップして、すばらしいスクリプトを作成します。
histtest.sh: 5: set: Illegal option -o history
短い答え:
history -p
明示的に履歴展開を実行するために使用します。
次に例を示します。
私にとってよくあるユースケースは次のとおりです。
私のbashがされているのでset -o histexpand
、通常私がやったことはタイピングです
vim $(!!)
前のコマンドでリストされたファイルを編集します。
悲しいことに間違いが起こることがあるので、による検証を有効にしshopt -s histverify
ます。
これで、Returnキーを1つ追加するだけで、拡張を検証できます。
今日は、これらの詳細を頻繁に使用するため、これらの詳細をbash関数にラップします。
function vk() {
set -o history && set -o histexpand;
vim -i ~/.viminfok $($(history -p !!));
}
ここでは、2つのネストされたを使用します。command substitution
内側のもの!!
は前のコマンドに展開し、外側のものはそれを実行して出力を取得します。
これで、3つのキーだけで同じ効果を得ることができ、そのうちの1つがReturn!
histtest.sh: 5: set: Illegal option -o history