스크립트에서 다양한 set
옵션을 효율적으로 사용하는 방법을 배우고 있습니다. 변수가 제대로 설정되지 않은 경우 (예 : 사용자 삭제) 내 스크립트를 종료하는 데 완벽한 것으로 보이는 set -u
를 발견했습니다. man 페이지에 따르면 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 및 “작동합니다”, ${testing2}
가 설정되지 않았습니다.
대신 0 및 “작동합니다”, 0 다음에 0 표시되지 않아야합니다.
누군가 지식을 제공 할 수 있습니까? 감사합니다.
댓글
- 후속 조치 … 변수를 null 문자열로 설정하는 것을 불법으로 만들거나 오류를 발생시키는 방법이 있습니까? ' 아닙니다.
답변
에서 man Bash “:
값이 할당 된 경우 매개 변수가 설정됩니다. 널 문자열은 유효한 값입니다. 변수가 설정되면 unset 내장 명령을 사용해야 만 설정을 해제 할 수 있습니다.
testing2=
변수를 null 문자열로 설정합니다.
unset testing2
로 변경하고 다시 시도하세요.
set -e
는 할당에 종료 코드 1이 없으므로 도움이되지 않습니다. 마지막으로 실행 된 명령 (할당)의 종료 코드가 0인지 확인하려면이를 시도하십시오. div id = “440d1cb6d2″>
이 질문 읽기 :
$ 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
답변
testing2=
는 testing2
변수를 빈 문자열로 설정합니다. 변수는 실제로 설정되어 있습니다 .
그러나 대화 형 Bash 셸에서 echo $testing99
를 실행하려는 경우 (errexit
, 즉 set -e
), 다음 오류가 발생합니다.
bash: testing99: unbound variable
곁에
지금 스크립트를 테스트하는 동안 대화 형 셸 이 항상 종료되는 것은 아닙니다. 비대화 형 셸 (셸 스크립트 실행)에서 설정되지 않은 변수를 확장하려고 할 때 항상 종료 . set
에 대한 POSIX man 페이지에 따르면 :
-u 쉘은 표준 오류에 메시지를 기록합니다. 설정되지 않은 변수를 확장하려고 할 때 즉시 종료됩니다. 대화 형 쉘은 종료되지 않습니다.
errexit
에 또한 설정되었습니다. 반면에 대화 형 대시 셸은 set -e
가 이전에 실행 되었더라도 종료되지 않습니다.
댓글
- 대시가 set -e로 종료되지 않는 경우; U를 설정; unset aa; echo $ aa, 그러면 대시가 잘못되었습니다.
- @schily 이것을 처음 발견했을 때 대시 작성자가 나보다 더 잘 알고 있고 POSIX 사양에 약간의 모호함이 있었지만 다시 pubs.opengroup.org/onlinepubs/9699919799/utilities/ … 를 확인했으며 버그처럼 보이는 것에 동의합니다. 좋습니다.
- 간단한 규칙이 있습니다. Korn Shell과 Bourne Shell이 모두 동의하고 다른 쉘 구현에 편차가 있으면 다른 쉘이 잘못 작동합니다.