Bashマニュアルから
exec [-cl] [-a name] [command [arguments]]
コマンドが提供されたら、新しいプロセスを作成せずにシェルを交換します。
このオプションが指定されると、
-l
シェルはに渡された0番目の引数の先頭にダッシュを配置しますcommand
。これがログインプログラムが行うことです。指定すると、
-a
シェルはname
0番目の引数として渡されますcommand
。
に渡された0番目のパラメータがない、または-l
に-a
渡された0番目のパラメータは何ですかcommand
?
-l
0番目の引数の先頭にダッシュを入れる目的は何ですか?
0番目のパラメータの先頭に-a
渡す目的は何ですか?name
実験してみます。最初の実験では何も出力されませんが、2番目の実験では何も出力されないのはなぜですかbash
?
$ bash; exec echo $0
$ bash;
$ exec 'echo' $0
bash
答え1
なし
-l
または-a
コマンドに渡された0番目の引数は何ですか?
この場合、0番目のパラメータはcommand
それ自体です。
-l 0番目のパラメータの先頭にダッシュを入れる目的は何ですか?
これはほとんどの(すべて?)シェルが従うルールです。ログインセッションが開始されると、シェルは0番目の引数(セッションを開始した引数によって配置されます)の前にハイフンを追加し、シェルlogin
は新しいログインセッションを開始するように指示します。
0番目のパラメータの先頭に
-a
渡す目的は何ですか?name
これは、実際にプロセスを開始するために使用されるパス名またはファイル名と[かなり]異なる0番目のパラメータを設定する唯一の方法です。これは、いくつかのコマンドがどのように機能するかを確認するために0番目の引数をチェックするためです。また、これを使用してプログラムが実際のパスとは異なるパス名で実行されていると思うように欺くこともできます(たとえば、データファイルを見つけるのに役立ちます)。
$ bash; exec echo $0
ちょっと変な命令ですね。確かに何かを出力しますがecho
(その後すぐにセッションを終了します)、最初に起動したサブシェルが終了するまではそうではありません。ここで正確に何をテスト/達成しようとしていますか?
機能をテストするには:
$ strace -fe execve bash -c 'exec -a foo echo test'
execve("/bin/bash", ["bash", "-c", "exec -a foo echo test"], [/* 56 vars */]) = 0
execve("/bin/echo", ["foo", "test"], [/* 56 vars */]) = 0
test
+++ exited with 0 +++
$ strace -fe execve bash -c 'exec -l echo test'
execve("/bin/bash", ["bash", "-c", "exec -l echo test"], [/* 56 vars */]) = 0
execve("/bin/echo", ["-echo", "test"], [/* 56 vars */]) = 0
test
+++ exited with 0 +++
$ (exec -a uname busybox)
Linux
$ (exec -l bash -c 'echo "$0"')
-bash
$ (exec -l ksh -c '[ -o login ] && echo yes')
yes
exec -l bash -c ...
(または)を使用すると、bash -lc ...
bashは読み込みます~/.bash_profile
が、そうでなければログインシェルとは見なされません。)