저는 이 문제를 며칠 동안 처리해 왔습니다. $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
사용하여 출력을 후처리 하지 않고 해당 옵션을 사용하여 단어 수를 얻을 수 있습니다 .sed
cut
-w
su - root -c 'echo $HOME | wc -w'