是否有设置目标应用程序第零个参数的POSIX方法?


21

在中,bash您还可以使用exec -a和中的zsh选项来设置ARGV0执行带有特定第零个参数的程序,但是还有POSIX方法吗?

该注释中所建议您可以创建一个(临时)符号链接来实现此目的,但是通过这种方式,我无法将新的第零个参数值设置为真正的任意值,例如具有某个绝对路径的命令。那么还有其他解决方案吗?

Answers:


27

不,除了编译可以执行此操作的C程序外,没有其他POSIX方法。作为一种快速而肮脏的:

$ echo 'int main(int c,char*v[]){
  execvp(v[1],&v[2]);perror(v[1]);return 127;}'>r.c && make r
$ ./r ps zzz -f
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas  7412  7411  0 10:44 pts/4    00:00:00 /bin/zsh
chazelas 21187  7412  0 22:33 pts/4    00:00:00 zzz -f

exec -a是支持ksh93bashzshbusybox ash(因为版本1.27.0) ,(yash 因为版本R50E)时,席利Bourne shell的(自2015年8月),因此是壳中最普遍。mksh

也许最可移植的方法是求助于perlC编译器。

$ perl -e 'exec {shift} @ARGV' ps zzz -f
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas  7554  7411  0 10:58 pts/12   00:00:00 /bin/zsh
chazelas  7630  7554  0 11:02 pts/12   00:00:00 zzz -f

15

为了完整起见,这里有一些人们已经编译过的C和C ++程序。

按照您的评论,您寻求“ POSIX方式”的明显动机是要知道如何使用Debian Almquist外壳,MirBSD Korn外壳(R50e之前的外壳)来达到相同的目的。 ),符合Debian POSIX的普通外壳程序,以及其他没有扩展名的外壳程序,如Bourne Again和Z外壳程序那样,将第0个参数设置为0。('93 Korn外壳程序,以及从R50e版本开始的MirBSD Korn外壳程序,都支持-a其内置exec命令选项。)

执行行

洛朗Bercot的execline自带exec命令。因此,要复制M. Chazelas的示例,将有一个execline脚本,例如

#!/ command / execlineb -P
exec -a zzz ps -f

当然,Bercot的exec命令是普通的外部命令。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,可以使用shell的execBercot进行覆盖,而Bercot exec依次设置第0个参数并覆盖目标程序:

exec / command / exec -a“ $ argv0” printer.sh

sh

nosh工具集包含一个exec命令。要复制M. Chazelas的示例,将有一个nosh脚本,例如

#!/ bin / nosh
exec -a zzz ps -f

虽然这是一个nosh内置的,这exec作为一个普通的外部命令访问。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,可以使用shell的execnosh工具集进行覆盖exec,后者再设置第0个参数并覆盖目标程序:

exec / usr / local / bin / exec -a“ $ argv0” printer.sh

perp

韦恩·马歇尔的专长包括一个runargv0命令。这是一个普通的外部命令。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,将使用shell的exec与perp工具集的进行覆盖runargv0,后者将设置第0个参数并与目标程序进行覆盖:

exec runargv0 printer.sh“ $ argv0”

运行

Gerrit Pape的runit包含一个chpst命令。这是一个普通的外部命令。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,可以使用shell的execrunit的覆盖chpst,这又将设置第0个参数并覆盖目标程序:

exec chpst -b“ $ argv0” printer.sh


1
作为一个难民从runit勉强转向systemd,我很高兴被介绍给我nosh。非常感谢!
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.