답변:
아니요, 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 년 이후)는 이렇게 조개 중 가장 널리 퍼져있다.
아마도 가장 이식성이 좋은 것은 아마도 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
완성도를 높이기 위해 사람들이 이미 컴파일 한 C 및 C ++ 프로그램이 있습니다 .
"POSIX 방식"을 요구하는 분명한 동기는 Debian Almquist 쉘, MirBSD Korn 쉘 (버전 R50e 이전)과 같은 쉘로이 같은 목표를 달성 할 수있는 방법을 아는 것입니다. ), 데비안 POSIX 호환 일반 셸 및 Bourne Again 및 Z 셸과 같이 0 번째 인수를 설정하기위한 확장이없는 기타 셸. ('93 Korn 쉘 및 버전 R50e 이후의 MirBSD Korn 쉘은 -a
내장 exec
명령에 대한 옵션을 지원 합니다.)
로랑 Bercot의가execline
함께 제공 명령 . M. Chazelas의 예제를 복제하려면 다음 과 같은 스크립트를 사용하십시오.exec
execline
#! / command / execlineb -P exec -a zzz ps -f
물론 Bercot exec
는 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 exec
Bercot로 오버레이 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 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 exec
nosh toolset 's exec
와 오버레이하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.
exec / usr / local / bin / exec -a "$ argv0"printer.sh
웨인 마샬의 범인은 포함 명령을 . 이것은 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 perp 툴셋으로 오버레이 하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.runargv0
exec
runargv0
exec runargv0 printer.sh "$ argv0"
리트 파페의 runit가 포함 명령을 . 이것은 일반적인 외부 명령입니다. 따라서 Debian Almquist Shell 스크립트 내에서 실행할 수 있습니다. 현재 쉘 프로그램을 오버레이하려면 쉘을 사용하여 runit ' s 로 오버레이 하면 0 번째 인수가 설정되고 대상 프로그램과 오버레이됩니다.chpst
exec
chpst
exec chpst -b "$ argv0"printer.sh
runit
마지 못해로 바뀌면서systemd
소개를하게되어 매우 기쁩니다nosh
. 많은 감사합니다!