Answers:
不,除了编译可以执行此操作的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
是支持ksh93
,bash
,zsh
,busybox ash
(因为版本1.27.0) ,(yash
因为版本R50E)时,席利Bourne shell的(自2015年8月),因此是壳中最普遍。mksh
也许最可移植的方法是求助于perl
C编译器。
$ 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
为了完整起见,这里有一些人们已经编译过的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的exec
Bercot进行覆盖,而Bercot exec
依次设置第0个参数并覆盖目标程序:
exec / command / exec -a“ $ argv0” printer.sh
nosh工具集包含一个exec
命令。要复制M. Chazelas的示例,将有一个nosh
脚本,例如
#!/ bin / nosh exec -a zzz ps -f
虽然这是一个nosh
内置的,这exec
是也作为一个普通的外部命令访问。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,可以使用shell的exec
nosh工具集进行覆盖exec
,后者再设置第0个参数并覆盖目标程序:
exec / usr / local / bin / exec -a“ $ argv0” printer.sh
韦恩·马歇尔的专长包括一个runargv0
命令。这是一个普通的外部命令。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,将使用shell的exec
与perp工具集的进行覆盖runargv0
,后者将设置第0个参数并与目标程序进行覆盖:
exec runargv0 printer.sh“ $ argv0”
Gerrit Pape的runit包含一个chpst
命令。这是一个普通的外部命令。因此,可以从Debian Almquist Shell脚本中运行它。要覆盖当前的shell程序,可以使用shell的exec
runit的覆盖chpst
,这又将设置第0个参数并覆盖目标程序:
exec chpst -b“ $ argv0” printer.sh
runit
勉强转向systemd
,我很高兴被介绍给我nosh
。非常感谢!