exec에 의해 실행된 명령의 0번째 매개변수

exec에 의해 실행된 명령의 0번째 매개변수

Bash 매뉴얼에서

exec [-cl] [-a name] [command [arguments]]

명령이 제공되면 새 프로세스를 생성하지 않고 셸을 교체합니다.

이 옵션이 제공 되면 -l쉘은 에 전달된 0번째 인수의 시작 부분에 대시를 배치합니다 command. 이것이 로그인 프로그램이 하는 일입니다.

제공 되면 -a쉘이 name0번째 인수로 전달됩니다 command.

에 전달된 0번째 매개변수가 없거나 -l-a전달된 0번째 매개변수는 무엇입니까 command?

-l0번째 인수의 시작 부분에 대시를 넣는 목적은 무엇입니까?

0번째 매개변수의 시작 부분으로 -a전달하는 목적은 무엇입니까 ?name

나는 실험을 시도합니다. 첫 번째 실험에서는 아무것도 출력되지 않는데 두 번째 실험에서는 아무것도 출력되지 않는 이유는 무엇입니까 bash?

$ bash; exec echo $0 

$ bash; 
$  exec 'echo' $0 
bash

답변1

없음 -l또는 -a명령에 전달된 0번째 인수는 무엇입니까?

이 경우 0번째 매개변수는 command그 자체입니다.

-l 0번째 매개변수의 시작 부분에 대시를 넣는 목적은 무엇입니까?

이것은 대부분의 (모두?) 쉘이 따르는 규칙입니다. 로그인 세션이 시작되면 쉘은 0번째 인수(세션을 시작한 인수에 의해 배치됨) 앞에 하이픈을 추가하고 login쉘은 이를 새 로그인 세션을 시작하라는 신호로 해석합니다.

0번째 매개변수의 시작 부분으로 -a전달하는 목적은 무엇입니까 ?name

이는 실제로 프로세스를 시작하는 데 사용되는 경로 이름이나 파일 이름과 [상당히] 다른 0번째 매개 변수를 설정하는 유일한 방법입니다. 이렇게 하는 이유는 일부 명령이 어떻게 작동해야 하는지 확인하기 위해 0번째 인수를 확인하기 때문입니다. 또한 이를 사용하여 프로그램이 실제 경로와 다른 경로 이름에서 실행되었다고 생각하도록 속일 수도 있습니다(예를 들어, 데이터 파일을 찾는 데 도움이 될 수 있습니다).

$ bash; exec echo $0

좀 이상한 명령이네요. 확실히 뭔가를 출력할 것이지만 echo(그런 다음 즉시 세션을 종료할 것입니다), 처음에 시작한 서브셸이 종료될 때까지는 그렇지 않습니다. 여기서 정확히 무엇을 테스트/성취하려고 합니까?

기능을 테스트하려면 다음을 수행하십시오.

$ strace -fe execve bash -c 'exec -a foo echo test'
execve("/bin/bash", ["bash", "-c", "exec -a foo echo test"], [/* 56 vars */]) = 0
execve("/bin/echo", ["foo", "test"], [/* 56 vars */]) = 0
test
+++ exited with 0 +++
$ strace -fe execve bash -c 'exec -l echo test'
execve("/bin/bash", ["bash", "-c", "exec -l echo test"], [/* 56 vars */]) = 0
execve("/bin/echo", ["-echo", "test"], [/* 56 vars */]) = 0
test
+++ exited with 0 +++
$ (exec -a uname busybox)
Linux
$ (exec -l bash -c 'echo "$0"')
-bash
$ (exec -l ksh -c '[ -o login ] && echo yes')
yes

exec -l bash -c ...( (또는 )를 사용하면 bash -lc ...bash는 을 읽지 ~/.bash_profile만 그렇지 않으면 로그인 쉘로 간주하지 않습니다.)

관련 정보