Existe uma maneira POSIX de definir zeroth argumento de um aplicativo de destino?

21

Em bashvocê pode usar exec -ae em zshvocê também pode configurar ARGV0um programa com um certo argumento zeroth, mas existe também uma maneira POSIX de fazer isso?

Como sugerido neste comentário, você pode criar um link simbólico (temporário) para conseguir isso, mas dessa maneira não pude definir o novo valor do argumento zeroth como realmente qualquer valor arbitrário, por exemplo, o comando com um determinado caminho absoluto. Então, existe alguma outra solução?

phk
fonte

Respostas:

27

Não, não há maneira POSIX, além de compilar um programa C que faz isso. Como uma rápida e suja:

$ 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é apoiado por ksh93, bash, zsh, busybox ash(desde a versão 1.27.0), yash, mksh( desde a versão R50e ), o Schily Bourne Shell (desde Agosto de 2015) isso é o mais difundido entre conchas.

Provavelmente, o mais portátil seria recorrer ao perlque é mais provável que esteja disponível do que um compilador 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
fonte
15

Para completar, aqui estão alguns programas em C e C ++ para fazer isso que as pessoas compilaram.

Seguindo o comentário que você aponta, sua aparente motivação para pedir "uma maneira POSIX" de fazer isso é saber como se pode alcançar esse mesmo fim com shells como o shell Debian Almquist, o shell MirBSD Korn (antes da versão R50e ), o shell Ordinário compatível com Debian POSIX e outros shells que não possuem extensões para definir o argumento 0 como os shells Bourne Again e Z possuem. (O shell Korn '93 e o MirBSD Korn da versão R50e em diante suportam uma -aopção para seus execcomandos internos .)

execline

Laurent Bercotexecline vem com um execcomando . Então, para duplicar o exemplo de M. Chazelas, seria necessário um execlinescript como

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

O Bercot execé um comando externo comum, é claro. Portanto, pode-se executá-lo a partir de um script Debian Almquist Shell. Para sobrepor o programa de shell atual, seria usado o shell execpara sobrepor ao Bercot exec, que por sua vez definiria o 0º argumento e sobreporia ao programa de destino:

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

nosh

O conjunto de ferramentas nosh inclui um execcomando. Para duplicar o exemplo de M. Chazelas, seria necessário um noshscript como

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

Embora seja noshinterno, tambémexec é acessível como um comando externo comum. Portanto, pode-se executá-lo a partir de um script Debian Almquist Shell. Para sobrepor o atual programa de shell, usaria o shell para sobrepor-se ao conjunto de ferramentas nosh , que por sua vez definiria o 0º argumento e sobrepor-se ao programa de destino:execexec

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

criminoso

O criminoso de Wayne Marshall inclui um runargv0comando . Este é um comando externo comum. Portanto, pode-se executá-lo a partir de um script Debian Almquist Shell. Para sobrepor o programa de shell atual, seria usado o shell execpara sobrepor-se ao conjunto de ferramentas perp runargv0, que por sua vez definiria o 0º argumento e sobrepor-se ao programa de destino:

exec runargv0 printer.sh "$ argv0"

executá-lo

O runit de Gerrit Pape inclui um chpstcomando . Este é um comando externo comum. Portanto, pode-se executá-lo a partir de um script Debian Almquist Shell. Para sobrepor o programa de shell atual, usaria o shell execpara sobrepor aos runit chpst, que por sua vez definiriam o 0º argumento e sobreporiam ao programa de destino:

exec chpst -b "$ argv0" printer.sh

JdeBP
fonte
1
Como refugiado, runitrelutantemente procurado systemd, fico muito feliz em ser apresentado nosh. Muito Obrigado!
Charles Duffy