exit を呼び出すと、それが logout のエイリアスになることを理解しています。時々、楽しみのために、セッションから自分自身を削除する必要がある場合は、 と入力します。が実行されたexit && 1
後、何が起きますか。 はどこに行くのでしょうか。 bash に 1 と入力すると、(当然ですが) 次のようになります。 1 が機能しない理由を尋ねているのではありません。 exit を呼び出した後、 1 はどこに行くのかを尋ねているのです。 1 は単なる例です。他のコマンドに置き換えてください。exit
1
1: command not found
しかし、入力するとexit &&&&&&& 1
構文エラーが発生します。そのため、右側を評価する必要があります。
免責事項これは私にとって興味深い質問です。何が起こるのか興味があるということ以外に、この質問には特別な理由はありません。
答え1
と入力するとexit
、シェルはすぐに終了し、1
評価されません。ソースコードを確認すると、出口、次のことがわかります:
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
最後に次のことexit
を行います。return (exit_or_logout (list))
static int
exit_or_logout (list)
WORD_LIST *list;
{
int exit_value;
..............
/* Get return value if present. This means that you can type
`logout 5' to a shell, and it returns 5. */
/* If we're running the exit trap (running_trap == 1, since running_trap
gets set to SIG+1), and we don't have a argument given to `exit'
(list == 0), use the exit status we saved before running the trap
commands (trap_saved_exit_value). */
exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list);
bash_logout ();
last_command_exit_value = exit_value;
/* Exit the program. */
jump_to_top_level (EXITPROG);
/*NOTREACHED*/
}
構文エラーはexit &&&&&&& 1
、式の評価の結果ではなく、解析エラーが原因です。解析はコマンドの実行前に行われます。
答え2
シェルが終了したため、実行されません。テストする簡単な方法は次のとおりです。
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
XTerm が終了しないように、最初に 2 番目のシェルを起動したことに注意してください。これを行わずに別のウィンドウからファイルの存在を確認した場合も同じ結果が得られます。
cmd1 && cmd2
cmd1
は を実行し、成功した場合 (終了コード = 0) は を実行することを意味しますcmd2
。つまり、最初にシェルが を実行しますexit
。終了するとシェルが存在しなくなるため、「成功した場合」の部分には到達しません。
構文エラーのフォローアップは異なります: 入力行がチェックされるときに構文がチェックされます解析された、その一部が実行される前に。基本的に、bash はあなたが何を意味しているかをまったく理解しないので、実行を開始できません。