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

16

Em bash , você pode usar exec -a e, em zsh , também pode definir ARGV0 para executar um programa com um determinado 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 forma eu Não foi possível definir o novo valor do argumento zeroth como verdadeiramente qualquer valor arbitrário, por exemplo o comando com um certo caminho absoluto. Então, existe alguma outra solução?

    
por phk 21.12.2015 / 11:34

2 respostas

25

Não, não há POSIX, além de compilar um programa em C que faz isso. Rápido e sujo:

$ 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 é suportado 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) é o mais difundido entre as conchas.

Provavelmente, o mais portátil seria recorrer a perl , que é 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
    
por 21.12.2015 / 12:03
14

Para completar, aqui estão alguns programas C e C ++ para fazer isso que as pessoas já têm compilado.

Indo pelo comentário que você aponta, sua aparente motivação para pedir "uma maneira POSIX" de fazer isso é saber como se pode alcançar este mesmo fim com shells como o shell do Debian Almquist, o shell MirBSD Korn ( antes da versão R50e), o shell Ordinary-Compliant do Debian POSIX, e outros shells que não possuem extensões para configurar o 0º argumento como os shells Bourne Again e Z possuem. (O shell '93 Korn e o shell MirBSD Korn da versão R50e em diante suportam uma opção -a para seus comandos exec incorporados.)

execline

execline de Laurent Bercot vem com an exec command . Então, para duplicar o exemplo de M. Chazelas, um teria um script execline como

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

O exec de Bercot é um comando externo comum, é claro. Então, pode-se executá-lo dentro de um script do Debian Almquist Shell. Para sobrepor o programa shell atual, seria usado o exec do shell para sobrepor com Bercot exec , que por sua vez configuraria o 0º argumento e a sobreposição com o programa de destino:

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

nosh

O conjunto de ferramentas inclui um comando exec . Para duplicar o exemplo de M. Chazelas, um teria um script nosh como

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

Embora seja um nosh embutido, esse exec é também acessível como um comando externo comum. Então, pode-se executá-lo dentro de um script do Debian Almquist Shell. Para sobrepor o programa shell atual, seria usado o exec do shell para sobrepor com exec do conjunto de ferramentas, que por sua vez definiria o 0º argumento e a sobreposição com o programa de destino:

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

perp

O perpetrador de Wayne Marshall inclui um comando runargv0 . Este é um comando externo comum. Então, pode-se executá-lo dentro de um script do Debian Almquist Shell. Para sobrepor o programa shell atual, seria usado o exec do shell para sobrepor com runargv0 do conjunto de ferramentas do perp, que por sua vez configuraria o 0º argumento e a sobreposição com o programa de destino:

exec runargv0 printer.sh "$argv0"

runit

Runit de Gerrit Pape inclui um comando chpst . Este é um comando externo comum. Então, pode-se executá-lo dentro de um script do Debian Almquist Shell. Para sobrepor o programa shell atual, seria usado o exec do shell para sobrepor com chpst do runit, que por sua vez configuraria o 0º argumento e a sobreposição com o programa de destino:

exec chpst -b "$argv0" printer.sh
    
por 21.12.2015 / 14:15