나는 LinuxMint(CentOS도 시도)를 사용하고 있으며 printenv 명령을 사용하여 존재하거나 존재하지 않을 수 있는 환경 변수를 설정하려고 했습니다. 따라서 존재하는 경우 해당 이름의 값을 인쇄하고, 그렇지 않으면 종료 코드 0을 반환하는 것 외에는 아무것도 인쇄하지 않기를 원합니다.
하지만 존재하지 않는 환경 이름으로 호출하면 오류 코드 1로 종료됩니다. 이 동작은 printenv의 매뉴얼 페이지나 도움말에 문서화되어 있지 않습니다.
내가 시도한 것은 다음과 같습니다.
> /usr/bin/printenv foo
방금 반환된 후 다음을 수행합니다.
> echo $?
반품:
1
printenv의 버전은 다음과 같습니다.
printenv (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie and Richard Mlynarik.
내가 원하는 것을 달성할 수 있는 다른 방법이 있는 사람이 있나요? 궁극적으로 환경 변수가 있는 경우 해당 값을 포함하도록 bash 변수를 설정하고, 그렇지 않으면 bash 변수를 삭제하면 됩니다.
mybashv=`printenv foo`
답변1
printenv의 정보 문서에는 종료 코드에 대해 다음과 같이 나와 있습니다.
0 if all variables specified were found
1 if at least one specified variable was not found
2 if a write error occurred
이는 관찰한 내용과 일치하는 것 같습니다.
제가 이해한 것이 맞다면 이 상태 코드를 숨기고 싶으신 것 같습니다. 모든 명령에 대해 를 추가하면 됩니다 || true
. 예를 들면 다음과 같습니다.
$ var=`printenv foo || true`
$ echo $?
0
답변2
환경 변수의 내용을 인쇄할 수 없을 때 0이 아닌 종료 상태(실패)를 반환하는 것은 나에게 옳은 일처럼 들립니다. 이는 tcsh
동일한 이름의 내장 함수 동작 및 BSD의 역사적 구현과 일치합니다.
이렇게 하지 않으면 null 값으로 설정된 변수와 설정되지 않은 변수를 구별하기가 어렵습니다.
set -e
/ 의 효과를 피하려면 set -o errexit
다음을 사용하십시오.
var=$(printenv VAR) || : Do not care if it fails
또는:
if var=$(printenv VAR); then
if [ -z "$var" ]; then
echo "VAR is set but empty or consists only of newline characters"
else
echo "VAR is set and non-empty"
fi
else
echo "VAR is not in the environment"
fi
또한 모든 쉘은 해당 환경 변수에서 쉘 변수를 초기화하므로(쉘 변수에 매핑될 수 있는 변수의 경우 일부 쉘은 매핑할 수 없는 변수를 제거함) $VAR
이를 사용하여 스크립트에서 이를 참조할 수도 있습니다. Bourne, csh 또는 tcsh 쉘( `...`
사람들이 여전히 쉘을 사용하고 싶어할 수 있는 유일한 쉘)에서 쉘 변수를 내보내지 않고(또는 setenv
for (t)csh)에 할당하지 않고 수정하는 경우) 함께 사용하십시오.