Unix端末でexitコマンドはどのように機能しますか?


14

誰かがexitコマンドがUnixターミナルでどのように機能するか説明してもらえますか?

検索man exit とはwhich exit有用ではなかったと私は、次の問題に遭遇しています。

新しいRed HatシステムにAnacondaとPyCharmのアドオンパッケージをインストールした後exit、ターミナルセッションを終了するように呼び出すと、一連のエラーが発生し、ターミナルが期待どおりに終了することに気付きました。エラーは、私の呼び出しがすることを示唆しているように見えるexitの呼び出しをトリガーされるrm ~/anaconda3/.../と、rm ~/PyCharm/....エラーを引き起こし、。すべてのディレクトリは、これらのプログラム用にダウンロードしたパッケージの場所(numpy)でもあるように見えます。以下を参照してください。

$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...

解決済み

私の~/.bash_logoutファイルでは、行がありました

find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;

この行をコメントアウトすると、エラーメッセージが停止しました。すべての一時ファイルを検索して削除するようです。ただし、「core」という単語が含まれるディレクトリを検索し、それらも削除しようとします。これはシステムのプリセットです。


ただ、明確にする:あなたがアナコンダとPyCharmのパッケージアドオンをインストールした後は、以下のことを言っている、あなたが使用するときは、エラーのシリーズを得るexitのうちに終了することのターミナル・セッション-またはそれが起こることを毎回使用するexitことの後に?
G-Manは、「Reinstate Monica」と言います

1
これらのアドオンパッケージをインストールした後、すべてのターミナルセッションで発生しました。
-arie64

1
非常に奇妙なことですexitが、エイリアスかどうかをすでに確認しましたか?
ドミニク

3
coreファイルを削除しようとする理由は、通常はクラッシュダンプファイル(コアダンプ)であり、スペースを占有しますが、クラッシュするソフトウェアを開発している場合を除き、ほとんど役に立ちません。この場合、という名前のディレクトリを削除しようとしcoreますが、失敗します(そして失敗するのnumpy.coreは良いことです-NumPyに不可欠です!)。
nneonneo

最近のほとんどのシステムは、デフォルトでコアダンプを書き込まないように構成されています(デフォルトにすることによりulimit -c 0)。find -exec rmとにかくそのコマンドは私が望むものではありませんが、追加できます-type f。また、使用して複数のファイルを削除することが多く、より効率的に作ることができる-exec rm {} +代わりに... \;、それは1つのに複数の引数をバッチ処理して、rm(xargsのような)コマンドライン
ピーター・コルド

回答:


20

まあ通常は、これを手動で設定した場合のみ、シェルを終了したときに実行が表示されます。ただし、インストールしたパッケージの1つにbash終了シェルスクリプトが付属している場合があります...

小切手;

〜/ .bash_logout

そこからスクリプト呼び出しが見つかるかもしれませんが、それは奇妙なことです...


OPは、ログアウトについてではなく、シェルを終了することについて話していました。
カウンター

1
@countermode、彼らはまた、ターミナルセッションで実行されてたログインシェルではなかったと述べていませんでした。
イルッカチュ

ログインシェルを使用していますが、この動作は<code> logout </ code>の呼び出しでも発生します。<code>〜/ .bash_logout </ code>に次の行があります
-arie64

<code> find -xdev /(-name *〜-o -name ./*~ -o -name core)-exec \ rm '{}' /; </ code>コメントアウト後、エラーは発生しません起こる。だから私はコメントが正しいと思う、この行は一時ファイルを削除しようとしている。ありがとうございました!
arie64

4
@ arie64-「<code>」はコメントでは機能しません。SEのコメント内のコードを示すには、コードの前後に「`」(グレーブアクセント/左一重引用符)を使用します。のように: `find -xdev ...`を取得しfind -xdev ...ます。
ケビンFegan

25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.

このようなトラップは、終了時にtmpfileをクリーンアップするためによく使用されます。https: //stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exitを参照して ください

次のような終了トラップを定義します(新しいシェルでのテストを改善するため)。

$ bash
$ trap "rm filetodelete" EXIT

定義済みのEXITトラップを表示:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT

テスト:

$ exit
rm: cannot remove filetodelete’: No such file or directory

exit暗黙的に「呼び出される」こともあることに注意してください。そのため、代わりにexitによってトラップをトリガーすることもできますkill -HUP $$


指摘する価値があるtype -a exit-> 最初にexit is a shell builtinbashのmanページを読む(またはhelp exitmanの代わりに実行する)方法を知っている。
ピーターコーデス

10

このexitコマンドは、シェルの特別な組み込みコマンドです。シェルプロセスを終了する必要があるため、組み込みである必要があります。

存在する場合は提供された終了ステータスでシェルを終了します。

終了すると、シェルはEXITトラップがあればそれを実行します。trap現在設定されているものについては、(Bourneのようなシェルの)出力を参照してください。

シェルは(いくつかのシステム/ユーザーがログインシェルを起動する端末エミュレータを設定する)ログインシェルとして呼び出された場合、多くのシェルでは、それはまたのような特別なファイルに保存されているコードを実行される~/.logout~/.zlogout~/.bash_logoutで、おそらく対応するものを/etcシェルに応じて、 。

あなたはできる set -x呼び出す前exitに、これらのコマンドがどこから実行されているのかを知る。


でデバッグするための素晴らしいアドバイスset -x
グレンジャックマン

set -x出力のログを取得するには、bashをクリアしない方法で実行するか、終了後にターミナルを閉じます。または、実行してset -xexec &> exit_log.txtやみくもに入力しexitます。
ピーターコーデス

3

exitbashの「組み込み」コマンドであるため、何のman exit助けにもなりません。

適切なドキュメントは、マニュアルページからman bash、またはhelpbash(help exit)の組み込みコマンドを使用して取得できます。

$ help exit
exit: exit [n]
    Exit the shell.

    Exits the shell with a status of N.  If N is omitted, the exit status
    is that of the last command executed.
$

どのように機能するかを本当に知りたい場合は、ソースをご覧くださいhttp : //git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

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