V bash
můžete použít exec -a
a v zsh
alternativně můžete také nastavit ARGV0
spustit program s určitým nultým argumentem, ale existuje také způsob POSIX, jak to udělat?
Jak je navrženo v tomto jednom komentáři, můžete vytvořit (dočasný) symbolický odkaz, abyste toho dosáhli, ale tímto způsobem jsem nemohl nastavit hodnotu nového nultého argumentu na skutečně jakoukoli libovolnou hodnotu, např. příkaz s určitou absolutní cestou. Existuje tedy nějaké jiné řešení?
Přijatá odpověď:
Ne, neexistuje žádný způsob POSIX, kromě kompilace programu C, který to dělá. Jako rychlý a špinavý:
$ 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
je podporován ksh93
, bash
, zsh
, busybox ash
(od verze 1.27.0), yash
, mksh
(od verze r50e), Schily Bourne Shell (od srpna 2015) je tak nejrozšířenější mezi mušlemi.
Pravděpodobně nejpřenosnější by bylo uchýlit se k perl
který je pravděpodobněji dostupný než kompilátor 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