bash
를 사용할 수 있고 0번째 인수를 사용하여 프로그램을 실행하도록 선택할 수도 있지만 exec -a
이를 수행하는 POSIX 방법이 있습니까?zsh
ARGV0
제안을 따르세요이 댓글에이를 달성하기 위해 (임시) 심볼릭 링크를 만들 수 있지만 새로운 0번째 인수 값을 특정 절대 경로가 있는 명령과 같은 임의의 값으로 설정할 수는 없습니다. 그럼 다른 해결책은 없을까요?
답변1
아니요, C 프로그램을 컴파일하는 것 외에 이를 수행하는 POSIX 방법은 없습니다. 빠르고 지저분한 접근 방식:
$ 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 버전부터 시작), 이것힐리 번 쉘(2015년 8월 기준) 따라서 조개껍데기 중 가장 널리 사용되는 조개입니다.
아마도 가장 이식성이 뛰어난 방법은 perl
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
답변2
완전성을 기하기 위해 사람들이 이 작업을 수행하는 몇 가지 C 및 C++ 프로그램은 다음과 같습니다.이미엮다.
귀하가 지적한 의견에 따르면 "POSIX 방식"을 요청한 명백한 동기는 Debian Almquist 쉘, MirBSD Korn 쉘(이전 버전 R50e)과 같은 쉘을 사용하여 동일한 목표를 달성하는 방법을 이해하는 것입니다. Debian POSIX 호환 일반 쉘 및 Bourne Again 및 Z 쉘과 같이 0번째 인수를 설정하는 확장자가 없는 기타 쉘. ('93 Korn 쉘과 R50e 버전으로 시작하는 MirBSD Korn 쉘은 -a
내장 exec
명령에 대한 옵션을 지원합니다.)
구현하다
로랑 베르코execline
함께 제공명령exec
. 따라서 M. Chazelas의 예를 복제하려면 execline
스크립트가 필요합니다.
#!/명령/execlineb -P -a zzz ps -f를 실행합니다.
exec
물론 베르코는 일반적인 외부 명령이다. 따라서 Debian Almquist Shell 스크립트에서 실행할 수 있습니다. 현재 셸 프로그램을 덮어쓰려면 셸을 사용하여 exec
Bercot 를 재정의 exec
하면 0번째 인수를 설정하고 대상 프로그램을 덮어씁니다.
exec /command/exec -a "$argv0" Printer.sh
간식
스낵 도구 세트포함하다명령exec
. M. Chazelas의 예를 복제하려면 다음 nosh
과 같은 스크립트가 필요합니다.
#!/빈/노쉬 -a zzz ps -f를 실행합니다.
nosh
내장되어 있지만 exec
,반품일반적인 외부 명령으로 액세스할 수 있습니다. 따라서 Debian Almquist Shell 스크립트에서 실행할 수 있습니다. 현재 쉘 프로그램을 덮어쓰려면 exec
nosh 도구 세트로 쉘의 재정의를 사용할 수 있습니다 exec
. 그러면 0번째 매개변수가 설정되고 대상 프로그램으로 덮어쓰게 됩니다.
exec /usr/local/bin/exec -a "$argv0" Printer.sh
범인
웨인 마샬의 범죄포함하다명령runargv0
. 이는 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트에서 실행할 수 있습니다. 현재 쉘 프로그램을 덮어쓰려면 shell exec
및 perp 도구 세트를 사용하여 덮어쓰면 됩니다 runargv0
. 그러면 0번째 매개변수가 설정되고 대상 프로그램으로 덮어쓰게 됩니다.
runargv0 Printer.sh "$argv0" 실행
달리다
게릿 펩의 루넷포함하다명령chpst
. 이는 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트에서 실행할 수 있습니다. 현재 쉘 프로그램을 덮어쓰려면 exec
runit override 와 함께 shell을 사용할 수 있습니다 chpst
. 그러면 0번째 매개변수가 설정되고 대상 프로그램으로 덮어쓰게 됩니다.
chpst -b "$argv0" Printer.sh 실행
ucspi TCP 프로토콜
Daniel J. Bernstein의 ucspi-tcp포함하다명령argv0
. (argv0
다음 대상에도 사용 가능DJB웨어.) 이는 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트에서 실행할 수 있습니다. 현재 셸 프로그램을 덮어쓰려면 exec
ucspi-tcp와 함께 셸을 사용하여 덮어 쓸 수 있습니다 argv0
. 그러면 0번째 매개변수가 설정되고 대상 프로그램으로 덮어쓰게 됩니다.
argv0 프린터.sh "$argv0" 실행