Macターミナルが同じコマンドを2つ連続して記憶するのはなぜですか?


9

最近、Ubuntuで作業する前にMacを使い始めました。

端末でこれらのコマンドを1つずつ実行するとします。

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

python main.pyもう一度実行したいので、上キーをクリックします。Ubuntuではキーを2回クリックするだけですが、Macでは7回クリックする必要があります。

2つの連続したコマンドが同じ場合、端末は2つの異なるコマンドを覚えるのではなく、1つのコマンドのみを覚えるべきです。

macOSでこれを実現するにはどうすればよいですか?


6
ただつまらないことに、これを実際に行っているのはMac端末ではありません。これはbashで、ターミナルで実行されているシェルです。多くのシェルがあり、デフォルトのシェルを他のようなものに置き換えたり、zshさらにさまざまなスクリプトでzshカスタマイズすることも可能です。
-gman

回答:


13

HISTCONTROL環境変数をに追加する必要があります.bash_profile。あなたに.bash_profile次の行を追加します。

export HISTCONTROL=ignoreboth:erasedups

bashセッションを閉じて再起動すると、重複はなくなります。または、同じ行を実行するだけで、そのセッションで有効になります(テストに使用します)。


(ターミナル)のマニュアルページbashから:

HISTCONTROL
コマンドを履歴リストに保存する方法を制御する値のコロン区切りリスト。値のリストにignorespaceが含まれる場合、スペース文字で始まる行は履歴リストに保存されません。ignoreupsの値により、前の履歴エントリに一致する行は保存されません。ignorebothの値は、ignorespaceおよびignoreupsの省略形です。erasedupsの値により、現在の行に一致する以前の行はすべて、その行が保存される前に履歴リストから削除されます。上記のリストにない値は無視されます。HISTCONTROLの場合設定されていないか、有効な値が含まれていない場合、シェルパーサーによって読み取られたすべての行は、HISTIGNOREの値に従って履歴リストに保存されます。複数行の複合コマンドの2行目以降はテストされず、HISTCONTROLの値に関係なく履歴に追加されます。


4

なぜこれが起こるのですか?

MacOSとUbuntuは、bashのコマンド履歴の重複を処理するために、デフォルトで異なる構成になっています。これらの構成は、いわゆる「ドットファイル」に格納されます。これらは〜/ .bash *およびシステム全体の/ etc / profileの形式を取ります。これらのファイルはすべて好みに合わせてカスタマイズでき、対話型シェル、ログインシェル、リモートシェルなどを区別できます。これらのファイルは特定の順序で読み取られ、特定の機能を提供します。

macOSで同じ動作を取得する方法は?

「コマンドラインの正確な重複を無視する」というこの1つだけのカスタマイズが必要な場合は、Allanの答えのようなものを使用できます。たとえば、bash_profileファイルに1行を追加します。「適切な方法」はありませんが、無数のオプションがあります。

これがbashの唯一のカスタマイズではない場合、これは最良のオプションではない可能性があります。

その他の注意事項:

  • グラフィカルアプリケーションまたはsh(またはshとして起動されるbash)が使用できるはずのすべてのものは〜/ .profileになければなりません
  • 〜/ .bashrcは何も出力してはいけません
  • ログインシェルのみが利用できるようにする必要があるものはすべて〜/ .profileに入れる必要があります
  • 〜/ .bash_loginが存在しないことを確認してください。

つまり、物事がより複雑になった場合、カスタマイズを複数のファイルに分散することをお勧めします。それぞれのファイルは、コンテンツに特化され、高度に順序付けられています。

exports監視を簡素化するために、すべてが独自のファイルに存在する場合があります。

ユーザーディレクトリのルートでbashによって読み取られるファイルを作成します。たとえば、次の.exportsものが含まれます。

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

インタラクティブな起動時にファイルがbashによって読み取られるように、これを「ソース」にする必要があります。

ファイルのソース
シェル構成が多数ある場合は、それらをいくつかのサブファイルに分割し、組み込みのソースを使用して.bashrc:から追加source ~/.exportsしてロードすることができます。

または、ロードする前にファイルが実際に存在することを確認する

if [ -f ~/.exports ]; then
. ~/.exports
fi

コマンド. ~/.exports~/.exports、現在実行中のシェルのコンテキストでソースします。

これはエイリアスを追加する場合に特に便利です。別のファイルを使用すると、変更を加えたときにエイリアスを簡単に再ロードできます。


2
.exports読み取り(ソース)方法は?
fd0

1
@ fd0、それ自体では、macOSでソースされません。アランの答えは、これを達成する適切な方法です。
user3439894

の値HISTCONTROLが設定され.bashrc~/.bashrcソースされ~/.bash_profileexportいるHISTCONTROL場合、変数は必要ありません。対話型ログインシェルと対話型シェルの両方に変数が設定されます。
fd0

@ fd0正確に:if。/わからない場合:私のポイントは、Allanの同時に投稿されたAにaltを提供することと、esp _profileを維持することでした。あなたの最後の点は、上記の方法を「間違っている」と感じるかもしれないので、追加することを提案するか、修正を意味しますか?さて、私は対処された複雑さのレベルで私のものとアランのものの間であなたのコメントを読みましたか?
LangLangC

1

すべての新しいコマンドを一意に記録することは難しいです。最初に追加~/.profileまたは類似する必要があります :

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

次に追加する必要があります~/.bash_logout

history -a
history -w
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.