コマンドラインでargv [0]を変更する

コマンドラインでargv [0]を変更する

私は数年(数十年)前に次のように話すことができるシステムを使用していたことを覚えています。

$ realname:newname A B C

そしてプログラムはと呼ばれますargv = { "newname", "A", "B", "C" }

ところで、それが何の殻だったかは覚えていません。

この機能は現在シェルに存在しますか?

修正する:

exec -aこれは私が望むように見えますが、プログラムの言語によっては一貫性のない動作が発生します(例えば、間違ったコードであることを知っています)。

$ cat argv.c  && cc argv.c
int main(int argc, char **argv) { printf("<< %s >>\n", argv[0]); }

$ (exec -a fake ./a.out)
<< fake >>

「C」ではうまく機能しますが、Pythonでは機能しません。

$ cat argv.py
#!/usr/bin/python3
import sys
print("<<", sys.argv[0], ">>")

$ (exec -a fake ./argv.py)
<< /home/ray/test/argv.py >>

ベストアンサー1

zsh(1990年に初めて出版された後):

$ ARGV0="new value for ps's argv[0]" ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
stephane   45193    2195  0 12:08 pts/11   00:00:00 /bin/zsh
stephane   45510   45193  0 12:15 pts/11   00:00:00 new value for ps's argv[0] -f

zsh辞書-コマンドを開始する組み込みコマンドもあります(ログインシェルでシェルを起動するために使用されます)。-argv[0]

$ - ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
stephane    2221    2195  0 06:21 pts/4    00:00:01 /bin/zsh
stephane   46537    2221  0 12:42 pts/4    00:00:00 -ps -f

ksh(1993年から)、bash(1996年2.0から)、扱いにくい(2008 4.3.5以降)、bosh(2015-08-27以降)、mksh(2016 R52c以降)、busybox ash(1.27.0(2017)以降)少なくとも:

$ (exec -a "new value for ps's argv[0]" ps -f)
UID          PID    PPID  C STIME TTY          TIME CMD
stephane    2221    2195  0 06:21 pts/4    00:00:01 /bin/zsh
stephane   46558    2221  0 12:43 pts/4    00:00:00 new value for ps's argv[0] -f

そしてperl

$ perl -e 'exec {shift} @ARGV' /bin/ps "new value for ps's argv[0]" -f
UID          PID    PPID  C STIME TTY          TIME CMD
stephane   46585    2195  0 12:44 pts/14   00:00:00 /bin/zsh
stephane   46646   46585  0 12:45 pts/14   00:00:00 new value for ps's argv[0] -f

そしてpython

$ python3 -c 'import os; import sys; os.execvp(sys.argv[1], sys.argv[2:])' ps "new value for ps's argv[0]" -f 
UID          PID    PPID  C STIME TTY          TIME CMD
stephane   46585    2195  0 12:44 pts/14   00:00:00 /bin/zsh
stephane   46985   46585  0 12:53 pts/14   00:00:00 new value for ps's argv[0] -f

execve()ただし、システムコールを使用して次に始まるスクリプトを実行するときは注意してください。

#! /path/to/interpreter optional-arg

シェルボーンとして:

execve("/path/to/script", ["arg0", "arg1", ...], env)

システムはそれを次に変換します。

execve("/path/to/interpreter", [something, "optional-arg", "/path/to/script", "arg1", ...], env)

存在とともにsomethingシステムによって異なるまたは(Linuxではe /path/to/interpreterargv0

インタプリタがAPIに引数リストを公開すると、パラメータリストも公開されます。スクリプト、いいえ通訳したがって、$0/が一番上にsys.argv[0]表示されませんが。something/path/to/script

おすすめ記事