2

zshbuiltins マニュアルから、

   exec [ -cl ] [ -a argv0 ] simple command
          Replace  the  current shell with an external command rather than forking.  With -c clear the environment; with -l prepend - to the argv[0] string of the command executed (to simulate a login shell); 
   with -a argv0 set the argv[0] string  of  the  command executed.  See the section `Precommand Modifiers'.

簡単なスクリプトで使っ-a てみたのですがうまくいかないようです

[balakrishnan@mylap scripts]$ cat printer.sh;echo "-----";cat wrapper.sh
#!/bin/sh
echo $0 $1 $2 $3 $4
-----
#!/bin/zsh
argv0="$0"
exec -a "$argv0" printer.sh
[balakrishnan@mylap scripts]$ wrapper.sh 
printer.sh
[balakrishnan@mylap scripts]$ 

wrapper.shとして設定したので、 echosのargv0ときに出力されることを期待しています。しかし、それでも印刷されます。printer.sh$0printer.sh

4

1 に答える 1

1

zshargv[0]正しく設定されていますが、/bin/sh実行してスクリプトを解釈すると、$0実行中のスクリプトの名前に設定され、無視されargv[0]ます。

マニュアルページではこのzsh動作について明示的に説明していませんが、bashマンページには次のように記載されています。

引数

オプションの処理後に引数が残っていて-c-s オプションも指定されていない場合、最初の引数はシェル コマンドを含むファイルの名前であると見なされます。bashがこの方法で呼び出された 場合$0、 はファイルの名前に設定され、位置パラメータは残りの引数に設定されます。


argv[0]シェル スクリプトの代わりに小さな C プログラムを実行すると、正しく設定されていることがわかります。

#include <stdio.h>

int main(int argc, char** argv) {
    printf("%s\n", argv[0]);
    return 0;
}
于 2013-04-19T18:50:41.190 に答える