¿Hay alguna forma POSIX de establecer el argumento cero de una aplicación de destino?

21

En bashpuede usar exec -ay en zshalternativamente también puede configurar ARGV0para ejecutar un programa con un cierto argumento cero, pero ¿hay también una forma POSIX de hacerlo?

Como se sugiere en este comentario , podría crear un enlace simbólico (temporal) para lograr esto, pero de esta manera no pude establecer el nuevo valor del argumento cero en un valor verdaderamente arbitrario, por ejemplo, el comando con una cierta ruta absoluta. Entonces, ¿hay alguna otra solución?

phk
fuente

Respuestas:

27

No, no hay forma POSIX, aparte de compilar un programa en C que lo haga. Como rápido y sucio:

$ 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 -acon el apoyo de ksh93, bash, zsh, busybox ash(desde la versión 1.27.0), yash, mksh( desde la versión R50e ), el Bourne Shell Schily (desde agosto de 2015) por lo que es el más extendido entre las conchas.

Probablemente lo más portátil sería recurrir a lo perlque es más probable que esté disponible que un compilador de 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
Stéphane Chazelas
fuente
15

Para completar, aquí hay algunos programas C y C ++ para hacer esto que la gente ya ha compilado.

Siguiendo el comentario al que apunta, su aparente motivación para pedir "una forma POSIX" de hacer esto es saber cómo se puede lograr este mismo fin con shells como el shell Debian Almquist, el shell MirBSD Korn (antes de la versión R50e ), el shell ordinario compatible con POSIX de Debian y otros shells que no tienen extensiones para establecer el argumento 0 como los shells Bourne Again y Z. (El shell Korn '93, y el shell Mirorn Korn desde la versión R50e en adelante, admiten una -aopción para sus execcomandos integrados ).

execlina

Laurent Bercotexecline viene con una execorden . Entonces, para duplicar el ejemplo de M. Chazelas, uno tendría un execlinescript como

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

Bercot execes un comando externo ordinario, por supuesto. Entonces uno podría ejecutarlo desde un script de Debian Almquist Shell. Para superponer el programa de shell actual, se usaría el shell execpara superponer con Bercot exec, que a su vez establecería el argumento 0 y se superpondría con el programa de destino:

exec / command / exec -a "$ argv0" printer.sh

comida

El conjunto de herramientas nosh incluye un execcomando. Para duplicar el ejemplo de M. Chazelas, se tendría un noshscript como

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

Aunque está noshintegrado, tambiénexec es accesible como un comando externo ordinario. Entonces uno podría ejecutarlo desde un script de Debian Almquist Shell. Para superponer el programa de shell actual, se usaría el shell para superponer con el conjunto de herramientas nosh , que a su vez establecería el argumento 0 y se superpondría con el programa de destino:execexec

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

perp

El asesino de Wayne Marshall incluye un runargv0comando . Este es un comando externo ordinario. Entonces uno podría ejecutarlo desde un script de Debian Almquist Shell. Para superponer el programa de shell actual, se usaría el shell execpara superponer con el conjunto de herramientas perp runargv0, que a su vez establecería el argumento 0 y se superpondría con el programa de destino:

exec runargv0 printer.sh "$ argv0"

ejecutarlo

La runa de Gerrit Pape incluye un chpstcomando . Este es un comando externo ordinario. Entonces uno podría ejecutarlo desde un script de Debian Almquist Shell. Para superponer el programa de shell actual, se usaría el shell execpara superponer con runit chpst, lo que a su vez establecería el argumento 0 y se superpondría con el programa de destino:

exec chpst -b "$ argv0" printer.sh

JdeBP
fuente
1
Como refugiado de runitmala gana systemd, me alegro mucho de que me presenten nosh. ¡Muchas gracias!
Charles Duffy