set -u 사용법이 예상대로 작동하지 않습니다


12

set스크립트에서 다른 옵션 을 효율적으로 사용하는 방법을 배우고 set -u변수가 올바르게 설정되지 않으면 (예 : 사용자 삭제) 스크립트를 종료하는 데 완벽한 것으로 나타 났습니다 . 에 따르면 사람의 페이지, set -u그리고 것은 set -e다음을 수행 ...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

이 기능을 테스트하기 위해 테스트 스크립트를 만들었지 만 예상대로 작동하지 않는 것 같습니다. 누군가 내 문제를 설명하고 잘못 해석하는 부분을 더 잘 설명 할 수 있습니까? 테스트 스크립트는 다음과 같습니다. 감사합니다.

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

스크립트에 0"This works" 가 표시 되고 ${testing2}설정되지 않으면 실패 합니다.

대신 0"This works"가 표시 되고 0 다음에 0 이 표시됩니다.

누구나 지식을 제공 할 수 있습니까? 감사합니다.


1
따라서 후속 조치 ... 변수를 null 문자열로 설정하는 것이 불법 / 오류를 일으키는 방법이 있습니까? 나는 추측하지 않습니다.
Luke Davis

답변:


10

"남자 배쉬"에서 :

매개 변수는 값이 지정되면 설정됩니다. 널 문자열은 유효한 값입니다. 변수가 설정되면 unset builtin 명령을 사용해야 만 설정이 해제 될 수 있습니다.

당신이 testing2=할 때 변수를 null 문자열로 설정합니다.

로 변경하고 unset testing2다시 시도하십시오.


set -e할당 코드가 종료 코드 1을 가지지 않으므로이 경우에는 도움 이 되지 않습니다. 마지막으로 실행 된 명령 (지정)에 종료 코드가 0인지 확인 하거나이 질문을 읽으십시오 .

$ false; a=""; echo $?
0

또한 set-e를 사용하는 것이 해결책보다 더 큰 문제라고 생각합니다.

설정되지 않은 변수를 사용하면 오류가 발생할 수 있습니다 set -u:

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

출력합니다 :

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

3

testing2=testing2변수를 빈 문자열로 설정합니다 . 변수는 실제로 설정 됩니다.

그러나 echo $testing99대화식 Bash 셸에서 설정하지 않은 errexit경우 (즉, 설정하지 않고 set -e) 오류가 발생합니다.

bash: testing99: unbound variable

곁에

지금 스크립트를 테스트하는 동안 비 대화식 쉘 (쉘 스크립트 실행)이 항상 종료 되는 동안 설정되지 않은 변수를 확장하려고 시도 할 때 대화식이 항상 종료 되지는 않습니다 . 대한 POSIX man 페이지에 따르면 :set

-u 쉘은 설정되지 않은 변수를 확장하려고 시도 할 때 표준 오류에 메시지를 작성하고 즉시 종료해야합니다. 대화식 쉘은 종료되지 않습니다.

하지 않는 한 대화 형 배쉬 쉘은 종료되지 않습니다 errexit가지고 있었다 세트를. 반면에 대화식 대시 셸 set -e은 이전에 실행 된 경우에도 종료되지 않습니다 .


대시가 set -e로 종료되지 않으면; U를 설정; 설정되지 않은 aa; 에코 $ aa, 대시가 잘못되었습니다.
schily

@schily 나는 이것을 처음 발견했을 때 대시 작성자가 나보다 더 잘 알고 POSIX 사양에 약간의 모호함이 있었지만 pubs.opengroup.org/onlinepubs/9699919799/utilities/… 를 다시 확인한 것을 알았습니다 . 버그처럼 보입니다.
Anthony Geoghegan

Korn Shell과 Bourne Shell이 ​​모두 동의하고 다른 쉘 구현에 편차가 있으면 다른 규칙이 잘못 동작하는 간단한 규칙이 있습니다.
schily
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.