web-dev-qa-db-ja.com

「出口」はどこで定義されていますか?

Bashコマンドで何か特別なことをしたいとします。簡単な例として、実行する前に「123」をエコーさせたいと想像してください。

これを行う簡単な方法の1つは、コマンドのエイリアスを作成することです。まだオリジナルが必要なので、whichを使用して見つけることができる正確なパスで参照できます。例えば:

$ which rm
/bin/rm
$ echo "alias rm='echo 123 && /bin/rm'" >> .bashrc

rmを使用してwhichへのパスを検索できたため、これは簡単でした。

しかし、私はexitでこれを行おうとしていますが、whichはそれについて何も知らないようです。

$ which exit
$ echo $?
1

コマンドはパスを出力せず、実際にはゼロ以外の終了コードを返しました。これは、コマンドが$PATHにない場合にwhichが行います。

多分それは関数だと思いましたが、どうやらそうではないようです:

$ typeset -F | grep exit
$ echo $?
1

したがって、exitコマンドは$PATHの関数またはコマンドとしてどこにも定義されていませんが、exitと入力すると、ターミナルが閉じます。ですから、どこかで明確に定義されていますが、どこにあるのかわかりません。

それはどこで定義されており、どのように明示的に呼び出すことができますか?

2
Isaac Betesh

exit はシェルです 特別な組み込み コマンド。それはシェルインタープリターで構築されました、シェルはそれを知っており、どこも検索せずに直接実行できます。

ほとんどのシェルでは、次のものを使用できます。

$ type exit
exit is a Shell builtin

シェルのソースを読んで、そのビルトインがどのように実装されているかを確認する必要があります。ここに、 bash exit builtin のソースへのリンクがあります。

bashzshksh93mkshpdkshexitビルトインを明示的に呼び出すには、builtinビルトインコマンドを使用します。

builtin exit

詳細については、 組み込みのシェルを明示的に呼び出す方法 を参照してください。

6
cuonglm

コマンドexitはbashの内部に属しています。これを使用して、いくつかのヘルプを見つけることができます。

$ help exit

これは、exitがシェルに認識されていることを示していますが、それは何ですか?:

$ type -a exit
exit is a Shell builtin

外部ファイルまたはプログラムとしては検出されず、シェルの外部には存在しません。

これを実行します:LESS=+/'^ *exit \[n\]' man bashこれを見つける:

exit [n]シェルをステータスnで終了させます。 nを省略した場合、終了ステータスは最後に実行されたコマンドのステータスになります。 EXITのトラップは、シェルが終了する前に実行されます。

また、 POSIXビルトインとして定義 です。

コードで明示的に呼び出すには、次を使用します。

builtin exit
1
user79743

exitはシェルのコマンドであるため、bashkshなどの任意のシェルにこのコマンドがあります

0
Lev Bystritskiy