Dans bash
vous pouvez utiliser exec -a
et en zsh
vous pouvez également définir ARGV0
pour exécuter un programme avec un certain argument zéro, mais existe-t-il également une manière POSIX de le faire ?
Comme suggéré dans ce commentaire, vous pouvez créer un lien symbolique (temporaire) pour y parvenir, mais de cette façon, je ne pouvais pas définir la nouvelle valeur d'argument zéro sur une valeur réellement arbitraire, par exemple. la commande avec un certain chemin absolu. Existe-t-il une autre solution ?
Réponse acceptée :
Non, il n'y a pas de moyen POSIX, autre que de compiler un programme C qui le fait. Comme rapide et sale :
$ 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
est pris en charge par ksh93
, bash
, zsh
, busybox ash
(depuis la version 1.27.0), yash
, mksh
(depuis la version r50e), le Schily Bourne Shell (depuis août 2015) est donc le plus répandu parmi les obus.
Le plus portable serait probablement de recourir à perl
qui est plus susceptible d'être disponible qu'un compilateur 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