なぜ `exec -a`が期待どおりに機能しないのですか?

なぜ `exec -a`が期待どおりに機能しないのですか?

execフラグの使い方を読んでいます-a。これSS64ドキュメント正確なようです。

実装する:

注文の実行

通事論:

exec [-cl] [-a name] [command [arguments]]

オプション:

-c   Causes command to be executed with an empty environment.

-l   Place a dash at the beginning of the zeroth arg passed to command.
     (This is what the login program does.)

-a   The shell passes name as the zeroth argument to command.

これをテストするために2つのスクリプトを作成しました。 1つはname foo/baz、もう1つは次のとおりですfoo/buzz

#!/usr/bin/env bash
# foo/baz

exec -a blah ./foo/bar 1 2
#!/usr/bin/env bash
# foo/buzz

exec ./foo/bar 1 2

これらの各スクリプトは、以下をfoo/bar実行する同じ下付き文字を実行します。

#!/usr/bin/env bash

echo "Hello world"
echo "0: $0"
echo "1: $1"
echo "2: $2"

-a私の目標は、0番目以降のパラメータにどのような影響があるかを確認することです。-a0番目のパラメータがフラグに渡されたパラメータに変更されると、-a実行時に0番目のパラメータにfoo/bazなると予想されます。blahなぜならそれが私が伝えたものだからです-a。ただし、スクリプトを実行すると、両方のケースの出力は同じです。

~/Workspace/OpenSource (master)  $ ./foo/baz 
Hello world
0: /Users/richiethomas/Workspace/OpenSource/foo/bar
1: 1
2: 2
~/Workspace/OpenSource (master)  $ ./foo/buzz
Hello world
0: /Users/richiethomas/Workspace/OpenSource/foo/bar
1: 1
2: 2

私は何が間違っていましたか?それとも私の期待は何か間違っているのでしょうか?

また、関連する質問です。 $ 1、$ 2、$ 3などを介して着信パラメータにアクセスするのではなく、0番目のパラメータをオーバーライドするユースケースは何ですか?

ベストアンサー1

0番目のパラメータをオーバーライドするユースケースは何ですか?

一部のプログラムは、呼び出し方法に応じて動作を変更します。例えば、busyboxこのように動作するマルチコールバイナリです。exec -a0番目のパラメータの値によって異なる動作が表示されます。

$ bash -c 'exec -a date /usr/sbin/busybox'
Sat Sep 17 20:22:14 EDT 2022
$ bash -c 'exec -a uptime /usr/sbin/busybox'
 20:22:17 up 23:48,  load average: 0.10, 0.20, 0.15

これは、exec -a <something>文書化されたとおりに機能することも示しています。

私は何が間違っていましたか?それとも私の期待は何か間違っているのでしょうか?

ここでの問題は、シェルスクリプトを使用していることです。./foo/bazコマンドラインに入力するときは、実際にはというコマンドを実行するわけではありません./foo/baz。のようなコマンドを実行することです/bin/bash /path/to/foo/baz。シェルに渡される0番目の引数には影響しますが...シェルは気にせず、次のようなシェルexec -aスクリプトに表示される変数を設定するときに独自のロジックを使用します。$0スクリプトname)と位置パラメータ$1$2...(スクリプトのパラメータを含む)。

(これはシェルスクリプトに限定されていません。ほとんどすべての解釈されたコードに同じことが当てはまります。)

おすすめ記事