대상 응용 프로그램의 0 번째 인수를 설정하는 POSIX 방법이 있습니까?


21

에서 bash사용할 수있는 exec -a과에서 zsh당신은 다른 방법으로도 설정할 수 있습니다 ARGV0특정 제로 번째 인수와 함께 프로그램을 실행뿐만 아니라 그렇게하는 POSIX의 방법은?

이 한 의견에서 제안한 것처럼 이것을 달성하기 위해 (임시의) 심볼릭 링크를 만들 수는 있지만이 방법으로 새로운 절대 값을 진정한 임의의 값으로 설정할 수 없었습니다 (예 : 특정 절대 경로가있는 명령). 다른 해결책이 있습니까?

답변:


27

아니요, POSIX 방식은 없습니다. POSIX를 수행하는 C 프로그램을 컴파일하는 것 외에는 없습니다. 빠르고 더러운 것 :

$ 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에 의해 지원됩니다 ksh93, bash, zsh, busybox ash(이후 버전 1.27.0) yash, mksh( 버전 r50e 이후 )에 Schily Bourne 쉘 (8 월 2015 년 이후)는 이렇게 조개 중 가장 널리 퍼져있다.

아마도 가장 이식성이 좋은 것은 아마도 perlC 컴파일러보다 사용하기 쉬운 것입니다.

$ 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

완성도를 높이기 위해 사람들이 이미 컴파일 한 C 및 C ++ 프로그램이 있습니다 .

"POSIX 방식"을 요구하는 분명한 동기는 Debian Almquist 쉘, MirBSD Korn 쉘 (버전 R50e 이전)과 같은 쉘로이 같은 목표를 달성 할 수있는 방법을 아는 것입니다. ), 데비안 POSIX 호환 일반 셸 및 Bourne Again 및 Z 셸과 같이 0 번째 인수를 설정하기위한 확장이없는 기타 셸. ('93 Korn 쉘 및 버전 R50e 이후의 MirBSD Korn 쉘은 -a내장 exec명령에 대한 옵션을 지원 합니다.)

execline

로랑 Bercot의가execline 함께 제공 명령 . M. Chazelas의 예제를 복제하려면 다음 과 같은 스크립트를 사용하십시오.execexecline

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

물론 Bercot exec는 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 execBercot로 오버레이 exec하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.

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

으악

nosh 툴셋 에는 exec명령이 포함되어 있습니다. M. Chazelas의 예제를 복제하려면 다음 nosh과 같은 스크립트 가 있습니다.

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

그것은하지만 nosh내장은,이 exec입니다 또한 일반 외부 명령으로 액세스 할 수. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 execnosh toolset 's exec와 오버레이하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.

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

퍼프

웨인 마샬의 범인은 포함 명령을 . 이것은 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 perp 툴셋으로 오버레이 하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.runargv0execrunargv0

exec runargv0 printer.sh "$ argv0"

리트 파페의 runit가 포함 명령을 . 이것은 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 runit ' s 로 오버레이 하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.chpstexecchpst

exec chpst -b "$ argv0"printer.sh


1
난민이 runit마지 못해로 바뀌면서 systemd소개를하게되어 매우 기쁩니다 nosh. 많은 감사합니다!
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.