履歴に残さずにコマンドを実行する[終了]


203

一部のコマンドを実行したいが、コマンド履歴に保存したくない。そのため、.bash_historyファイル内で検索することはできません。

この方法でbashコマンドを実行する方法はありますか?


13
これは「サーバー管理者」ほど「プログラミング」ではないため、おそらくこの質問をServerFaultに移動する必要があります。
Andrew Theken 2014

回答:


294

スペースでコマンドを開始すると、コマンドは履歴に含まれません。

これには、環境変数$HISTCONTROLを設定する必要があることに注意してください。

  • 次のコマンドが返されることを確認するignorespaceか、 ignoreboth

    #> echo $HISTCONTROL
  • 存在しない場合に環境変数を追加するには、次の行をbashプロファイルに追加できます。例えば%HOME/.bashrc

    export HISTCONTROL=ignorespace

プロファイルを再度ソースした後、スペースが前に付いたコマンドは書き込まれません $HISTFILE


20
これは、ignorespaceが$ HISTCONTROLに含まれていない限り機能しません-これはおそらくほとんどのシステムのデフォルトです。
pgl 2011

2
正しい。詳細については、OPのbashのマニュアルページでHISTCONTROLとHISTIGNOREを参照してください。
u-punkt

2
thegeekstuff.com/2008/08/…-コマンドを履歴から隠すこの方法を含む、より多くのbash履歴のヒントがここにあります
user379997

52

特定のBashセッションで、次のように入力して、履歴ファイルを/ dev / nullに設定します。

export HISTFILE=/dev/null

コメントで指摘されているように、これはそのセッションのコマンドを履歴に書き込まないことに注意してください!

システム管理者のハードワークに手を加えないでください。;)

Doodadのソリューションはよりエレガントです。単に変数の設定を解除します:(unset HISTFILEありがとう!)


5
これにより、すべてのコマンドがログに記録されなくなります。それは質問者が望んでいることではありません。
Noufal Ibrahim

12
これにより/dev/null、ログアウト時にアクセス許可が0600に設定されることに関連する問題が発生しました。代わりに使用しましたunset HISTFILE
Doodad 2014年


21

@John Doeと@ user3270492の回答の拡張。しかし、これは私にはうまくいくようです。

<your_secret_command>; history -d $((HISTCMD-1))

履歴にコマンドのエントリが表示されないはずです。

ここに説明があります。

'history -d'は、言及されたエントリーを履歴から削除します。

HISTCMDは、次に実行されるコマンドのcommand_numberを格納します。したがって、(HISTCMD-1)は最後に実行されたコマンドを指します。

Bash履歴ファイルから特定の行を削除する


残念ながら、これは私にはうまくいきませんでした。
魔術

10

おそらく、履歴のないシェルの使用を検討するかもしれません。

/bin/sh << END
   your commands without history
END

(多分/bin/dashまたは/bin/sashより適切かもしれない/bin/sh

またはさらにバッチユーティリティを使用する

batch << EOB
   your commands
EOB

歴史はそれから含んでいるshbatch、あまり意味がない


8

あなたはあなたのセッションを始めることができます

export HISTFILE=/dev/null ;history -d $(history 1)

その後、卑劣な行為を続行します。histfileをに設定する/dev/nullと、履歴ファイルに記録されますが、このエントリはすぐに削除され、トレース(少なくとも履歴ファイル内)は表示されません。

また、これは永続的ではありません。


これはすでに何度も答えられていました。あなたの答えはこのスレッドに何を追加すると思いますか(役に立たないノイズを除いて)?
gniourf_gniourf 2018年

それはされなかった1つの答えにまとめるように、自身が履歴に表示コマンドがない、何ものは、その後、入力されたことを表示していませんが。
クリスチャン

1
しかし、今、このスレッドは本当の混乱です!この場合、特にそのような古い質問の場合は、既存の適切な回答を編集するか、コメントを残す方が良いと思います…
gniourf_gniourf

5

Doodadがコメントで述べたようにunset HISTFILEこれはうまくいきますが、履歴も削除したい場合はecho $HISTFILE、履歴ファイルの場所(通常は~/.bash_history)を取得してunset HISTFILE編集します~/.bash_history(または何であれHISTFILE-もちろん、今ではunsetこれでできるので、 t読んでください)。

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

次に、履歴と編集した事実を編集しました。


これを試してみました:GNU bash、バージョン3.2.57(1)-release(x86_64-apple-darwin15)で動作しません。HISTORYの設定を解除した後に使用したコマンドは、〜/ .bash_history
Krystian

@Krystian私の間違い-「unset HISTORY」を「unset HISTFILE」と書いていたはずですが、修正されました。今は機能しますか?GNU bash、バージョン4.3.30(1)-release(x86_64-pc-linux-gnu)で動作します。
drkvogel 2017年

よくわかりません。簡単なテスト:前から最後までunset HISTFILE; echo TEST; historyのコマンドを提供しますecho TEST。セッションを終了して再度接続した後でも、履歴には実際にこのエントリはありません。だから私はそれがうまくいくと思います:)
Krystian

unset HISTFILEメモリ内の履歴に記録されているコマンドを停止するようには見えませんが、$ HISTFILEがあったファイルに記録されているコマンドを停止します。だから、あなたはまだあなたのローカル履歴をメモリに持っていると思いますが、それはもうファイルに記録されていません、それはあなたが望むかもしれないことです!;)
drkvogel

4

次のコマンドを使用することもできます。

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

とても持ち運びしやすいコマンドだと思います。


私はalias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"これからエイリアスを作成しました:そして今あなたはこのようなことをすることができます:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
申し訳ありませんが、引用符$sがsedの意味やその他のものを変更するため、エイリアスではなく関数を作成する必要があることに気づきました。function forget() { // put code here // }
sobi3ch 2017年

3

zshを使用している場合は、以下を実行できます。

setopt histignorespace

これを設定すると、スペースで始まる各コマンドは履歴から除外されます。

エイリアスを使用し.zshrcて、これをオン/オフにすることができます。

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

ニース、しかし、この質問を具体的にタグ付けされているbashの
tripleee

2

これを実現する方法はいくつかあります。これにより、履歴ファイルのサイズが0に設定されます。

export HISTFILESIZE=0

これにより、履歴ファイルがに設定され/dev/null、効果的に無効になります。

export HISTFILE=/dev/null

個々のコマンドについては、コマンドの前にスペースを付けることができ、それは履歴ファイルに保存されません。これにはignorespace$HISTCONTROL環境変数に値を含める必要があることに注意してください(man bashでignorespace詳細を検索してください)。


2
これにより、すべてのコマンドがログに記録されなくなります。それは質問者が望んでいることではありません。
Noufal Ibrahim

まあ、私は質問者が彼がログに記録されるべきではないものを望んだものなら何でもした後で値をリセットすると想定していた。
pgl 2011

1

これは、すべての履歴を消去したことを含め、すべての履歴を消去したい場合に便利です。

rm .bash_history;export HISTFILE=/dev/null;exit

0

あなただけを実行する必要があります:
$ set +o history

詳細を表示するには、次を実行:
$ man set


2
これにより、個々のコマンドではなく、今後のすべてのコマンドの履歴が無効になります。ここに来るほとんどの人々は代わりに受け入れられた答えを見るべきです。
Tripleee、2018年

これは有効ですが、大丈夫ですが不完全です。set -x history後でreverseコマンドを追加する限り、機能します。
Abdillah

0

このコマンドは便利かもしれません。これは実行されたコマンドを記録しません

history -d $((HISTCMD-1)) && <Your Command Here>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.