su를 사용하여 사용자의 환경 변수가 존재하는지 확인하십시오.

su를 사용하여 사용자의 환경 변수가 존재하는지 확인하십시오.

저는 이 문제를 며칠 동안 처리해 왔습니다. $1 사용자에 대해 환경 변수 $2가 존재하는지 확인해야 합니다.

나는 몇 가지 사례를 시도했습니다.

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(그래서 아니오 (Bash> 4.2를 시도했습니다))

if [ su - ${1} -c "[ -z "${2}" ]" ]

이제 문제가 보이지 않기 때문에 이 접근 방식을 시도하고 있습니다 :/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

답변1

첫 번째 예의 구문이 올바르지 않습니다. 당신이 쓰는 경우 :

[[ -v $HOME ]]

그런 다음 실제로 다음 명령을 실행합니다.

[[ -v /home/yourusername ]]

물론 이것은 실패할 것이다. 당신이 원하는 것:

[[ -v HOME ]] && echo ok || echo no

이를 다음과 결합 할 수 있습니다 su.

su - root -c "[[ -v HOME ]]" && echo ok || echo no

따옴표를 중첩할 수 없고 명령이 실행되기 전에 쉘 변수 확장이 발생하기 때문에 마지막 예는 작동하지 않습니다. 즉, 다음과 같이 주어진다:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

실제로 실행하는 명령은 다음과 같습니다.

su - root -c 'echo /home/somesuser | ...'

$HOME관점에서 값을 얻으려면 root작은따옴표 등을 사용하여 로컬 셸에서 변수 확장을 방지해야 합니다.

su - root -c 'echo $HOME | ...'

wc단어 수가 $HOME거의 항상 이기 때문에 출력을 에 전달하려는 이유가 명확하지 않습니다 1. 또는 다음을 wc사용하여 출력을 후처리 하지 않고 해당 옵션을 사용하여 단어 수를 얻을 수 있습니다 .sedcut-w

su - root -c 'echo $HOME | wc -w'

관련 정보