환경 이름이 존재하지 않기 때문에 printenv가 오류 코드 1로 종료되었습니다.

환경 이름이 존재하지 않기 때문에 printenv가 오류 코드 1로 종료되었습니다.

나는 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 쉘( `...`사람들이 여전히 쉘을 사용하고 싶어할 수 있는 유일한 쉘)에서 쉘 변수를 내보내지 않고(또는 setenvfor (t)csh)에 할당하지 않고 수정하는 경우) 함께 사용하십시오.

관련 정보