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

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

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ファイルに1行があります

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

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

答え1

man bash

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

これらのトラップは、シャットダウン時にtmpファイルを整理するためによく使用されます。 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 $$

答え2

通常、このオプションを手動で構成すると、シェルを終了したときにのみ実行が表示されます。ただし、インストールしたパッケージの1つにbash exitシェルスクリプトが付属している可能性があります。

確認する。

~/.bash_logout

おそらくそこで奇妙なスクリプト呼び出しを見つけるでしょう。

答え3

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

これはシェルを終了し、終了状態(存在する場合)または最後のコマンドの終了状態を提供します。

終了すると、シェルはEXITトラップ(存在する場合)を実行します。現在の設定の出力を表示しますtrap(Bourneなどのシェルから)。

多くのシェルでは、シェルがログインシェルとして呼び出されると(一部のシステム/ユーザーはログインシェルを起動するように端末エミュレータを設定します)、特殊ファイル(たとえば)に格納されているコードとシェル~/.logoutに対応するコード~/.zlogoutも実行します。~/.bash_logout/etc

これらのコマンドが実行される場所を理解するために、呼び出すset -x前にこれを実行できます。exit

答え4

exitこれはbashの「組み込み」コマンドなので、man exit役に立たないのは当然です。

適切な文書は、man bashマニュアルページまたはbash()組み込みコマンドを使用して取得できます。helphelp 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/buildins/exit.def?h=bash-4.4

関連情報