ゼロ以外のコードで終了する私の端末のコマンドは、端末ウィンドウを閉じます


22

最初は「バッシュルーレット」をプレイするように少し面白かったのですが...

ゼロ以外のコードで終了する私の端末のコマンドは、端末ウィンドウを閉じます

おそらくset -e、端末のソースをどこかにbashスクリプトで設定したと言われました。

.bash_profile/ .bashrc/ .profileを確認しましたset -eが、そこにあるようには見えません。

他に明らかな犯人はいますか?


7
を実行しset +e、問題を修復しますか?もしそうなら、私はそれを探して、あなたはそれを探し続ける必要がありますset -e。これらは/etc、の下にあるこれらのファイルのグローバルバージョン、またはそれらをソースとする他のスクリプトに存在する可能性があります。構成ファイルを移動します。問題が修正されたら、小さなチャンクで行を追加し直して、どこで壊れているかを確認します。
エグモント

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trap有益である可能性があります。
ムル

次の-ような特別な変数を使用して、現在有効なシェルフラグのセットを調べることができますecho $-
デビッドフォースター

回答:


21

申し分なく、それで、本当に、それはset -e私のトラブルを引き起こした気まぐれでした。

私が見つけた方法set -eは使用していましたbash -lx

最善の方法は、以下を使用することです。

bash -lx > lx.log 2>&1

その後、そのログファイルを開き、検索を行いsetます...

そのわがままを見つけset -eたら、その行を削除することができ、あなたの問題はなくなるはずです!(マシンの再起動は良いアイデアかもしれません)。

私の場合、これset -eは.bash_profileソースのファイルにありましたが、行は.bash_profile自体にはありませんでした。


3
sourceシェルで安全なものは、単なる「ランダムシェルスクリプト」よりもはるかに小さいセットです。 -eダムエラーチェックのために、実際のスクリプトで役立ちます。(または、エラーチェックを忘れていないことを確認するために。)
ピーターコーデス

どうやらそうだ...私は含まれているスクリプトにのみ影響を与えるようなものがglobal set -eあればいいのにと思うset -e
Alexander Mills

@AlexanderMills、それを行うに$-は、内部スクリプトのフラグをチェックして最後に状態を復元するか、それを設定するスクリプトをソースしていることがわかっている場合はメインスクリプトでリセットすることができます
ilkkachu

だから私local set -eはbash関数でしか使用できないと思いますか?
アレクサンダーミルズ

13

問題を解決したいだけなら、最後に — に含めset +eてください.bashrc

あなたは掘りに行くことができます-他にも多くの場所があるset -eかもしれませんが、それは多くの面倒を見るでしょう。

ただし、set -eがの一部である$PROMPT_COMMAND場合、上記は機能しません。printf '%s\n' "$PROMPT_COMMAND"何が入っているか試してみてください。


私のマシン上で、私は、端末を開くと、printf '%s\n' "$PROMPT_COMMAND"そこには何も、ちょうど空白を生じない
アレクサンダー・ミルズ

@AlexanderMills、それはあなたの問題ではありません。一般的な用途の1つ$PROMPT_COMMANDは、ターミナルタブ名またはウィンドウ名を更新することです。MacOS XとUbuntuの両方がこれを行います。Mac用のこのデータについては、apple.stackexchange.com / q / 220641/151730を参照してください。
ワイルドカード

問題に対する回答を見つけて、自分の回答を追加しましたが、機能set +eしませんでした。おそらく、ソースbashファイルでの呼び出しのだったためset -eです。
アレクサンダーミルズ

1
@AlexanderMills、はい、それは暗黙的だと思いました。最初に追加 set +eするの.bashrcではなく、に追加するつもりでした。私は今、その答えを明確にしました。ソースを見つけてよかった!
ワイルドカード

ええ、set +e明らかにバンドエイドですが、あなたはそれを述べました
アレクサンダーミルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.