Bash 매뉴얼에는 다음과 같이 명시되어 있습니다.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
나는 노력한다
eval `nonsense`
echo $?
밝혀지다 0
.
그리고 백틱 명령을 단독으로 실행하면 다음과 같습니다.
`nonsense`
echo $?
밝혀지다 127
.
eval
Bash 매뉴얼에 쓰여진 내용에 따르면, 매개변수로 주어지면 백틱이 반환되기를 원합니다 .127
nonsense
매개변수의 종료 상태를 얻는 방법은 무엇입니까 eval
?
답변1
다음을 수행할 때 -
`nonsense`
echo $?
기본적으로 "말이 안되는 명령의 출력을 얻으려고 할 때 종료 상태를 알려주십시오"라고 묻는 것이며 대답은 "명령을 찾을 수 없음" 또는 127입니다.
하지만 다음을 수행하면
eval `nonsense`
echo $?
eval
"빈 문자열을 평가할 때 eval의 종료 상태를 알려주세요"(의미 없는 명령의 출력)라고 묻는 것은 인수 없이 실행하는 것과 같습니다 .
eval
매개변수 없이 실행하면 문제가 없으며 종료 상태가 0이 됩니다.
답변2
실제로는 그 이상입니다.
$ `nonsense`
bash: nonsense: command not found
$ echo "$?"
127
이것은 놀라운 일이다.
bash
stdout 에서 Split+glob 연산자의 결과 명령을 실행하라는 요청을 받습니다 nonsense
. 출력이 생성되지 않으므로 nonsense
명령을 실행하지 않으므로 종료 상태가 0이어야 한다고 생각할 수 있습니다.
그러나 실제로 간단한 명령줄에 인수가 없고 할당 또는 리디렉션만 있는 경우 종료 상태는 실행의 할당 및 일반 단어(리디렉션 대상이 아님)로 대체된 마지막 명령의 종료 상태입니다(리디렉션이 있지만). failed 종료 상태에도 영향을 미칩니다).
이는 특히 숙제에 유용합니다.
존재하다:
output=$(grep pattern file)
status=$?
grep
해당 비명령의 종료 상태라면 얻을 수 없는 출력과 종료 상태를 얻을 수 있습니다 .$?
존재하다:
output=$(cmd1) cmd2
즉, 할당 단어와 매개변수 단어가 모두 있는 경우에는 종료 상태가 cmd1
무시됩니다. $?
포함될 종료 상태입니다 cmd2
.
그리고 only $output
로 설정됩니다 cmd2
. 예외는 cmd2
특수 내장 함수인 경우입니다.
eval
그런특수 내장.
$ a=0; a=1 eval; echo "$a"
1
bash
대부분의 최신 POSIX 쉘 에 있습니다 .
a=`exit 5` eval; echo "$?"
또는
eval `exit 5`; echo "$?"
eval
인수 없이 실행한 결과이므로 0을 출력합니다. 특별한 내장 명령에 대한 종료 상태를 얻을 수 있는 Bourne 쉘이나 ksh88에서는 그렇지 않습니다 exit 5
.
이 셸 내에서는 다음도 찾을 수 있습니다.
$ a=`exit 3` set x; echo "$?"
3
set
또 다른 특수 내장 기능도 마찬가지입니다.
.
또 다른 특별한 내장 기능입니다. Bourne 쉘 및 ksh88에서:
$ . /some/file `exit 4`; echo "$?"
4
/some/file
( 어떤 명령도 실행하지 않는 한 )