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

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

며칠 전부터 계속해서 환경 변수 $2가 존재하는지 사용자 $1을 확인해야 합니다.

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

 $ [[ -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. wcwith sed또는 의 출력을 후처리하는 대신 옵션을 사용하여 단어 수를 얻을 cut수 있습니다 .-w

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

관련 정보