Esiste un modo POSIX per impostare l'argomento zeroth di un'applicazione di destinazione?


21

In bashpuoi usare exec -ae in zshpuoi alternativamente anche impostare ARGV0l'esecuzione di un programma con un certo argomento zeroth ma esiste anche un modo POSIX per farlo?

Come suggerito in questo unico commento, è possibile creare un collegamento simbolico (temporaneo) per raggiungere questo obiettivo, ma in questo modo non ho potuto impostare il nuovo valore dell'argomento zeroth su qualsiasi valore arbitrario, ad esempio il comando con un certo percorso assoluto. Quindi c'è qualche altra soluzione?

Risposte:


27

No, non esiste alcun modo POSIX, oltre alla compilazione di un programma C che lo fa. Come veloce e sporco:

$ 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è supportato da ksh93, bash, zsh, busybox ash(a partire dalla versione 1.27.0), yash, mksh( a partire dalla versione R50e ), lo Schily Bourne Shell (da August 2015) in modo da è la più diffusa tra le conchiglie.

Probabilmente il più portatile sarebbe ricorrere a perlquale è più probabile che sia disponibile rispetto a un compilatore 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

15

Per completezza, ecco alcuni programmi C e C ++ per fare ciò che le persone hanno già compilato.

Seguendo il commento a cui fai riferimento, la tua apparente motivazione per chiedere "un modo POSIX" di fare questo è sapere come si può raggiungere lo stesso scopo con shell come la shell Debian Almquist, la shell MirBSD Korn (prima della versione R50e ), la shell ordinaria conforme a POSIX Debian e altre shell che non hanno estensioni per l'impostazione del 0 ° argomento come hanno le shell Bourne Again e Z. (La shell Korn '93 e la shell Korn MirBSD dalla versione R50e in poi supportano -aun'opzione per i loro execcomandi integrati .)

execline

Laurent Bercotexecline arriva con un execcomando . Quindi per duplicare l'esempio di M. Chazelas si dovrebbe avere una execlinesceneggiatura come

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

Bercot execè un normale comando esterno, ovviamente. Quindi è possibile eseguirlo da uno script Debian Almquist Shell. Per sovrapporre il programma di shell corrente si utilizzerebbero quelli della shell execper sovrapporre Bercot exec, che a sua volta imposterebbe il 0 ° argomento e si sovrapporrebbe al programma di destinazione:

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

fare uno spuntino

Il set di strumenti di nosh include un execcomando. Per duplicare l'esempio di M. Chazelas si dovrebbe avere una noshsceneggiatura come

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

Sebbene sia noshintegrato, execè accessibile anche come un normale comando esterno. Quindi è possibile eseguirlo da uno script Debian Almquist Shell. Per sovrapporre l'attuale programma di shell si dovrebbero usare le shell execper sovrapporre il set di strumenti di nosh exec, che a sua volta imposterebbe l'argomento 0 e si sovrapporrebbe al programma di destinazione:

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

perp

Il criminale di Wayne Marshall include un runargv0comando . Questo è un normale comando esterno. Quindi è possibile eseguirlo da uno script Debian Almquist Shell. Per sovrapporre il programma di shell corrente si dovrebbero usare le shell execper sovrapporre il set di strumenti di perp runargv0, che a sua volta imposterebbe l'argomento 0 e si sovrapporrebbe al programma di destinazione:

exec runargv0 printer.sh "$ argv0"

eseguirlo

La runit di Gerrit Pape include un chpstcomando . Questo è un normale comando esterno. Quindi è possibile eseguirlo da uno script Debian Almquist Shell. Per sovrapporre l'attuale programma di shell si dovrebbero usare le shell execper sovrapporre a runit chpst, che a sua volta imposterebbe l'argomento 0 e si sovrapporre al programma di destinazione:

exec chpst -b "$ argv0" printer.sh


1
Come rifugiato a cui si è runitrivolto con riluttanza systemd, sono molto contento di essere presentato nosh. Grazie molto!
Charles Duffy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.