며칠 전부터 계속해서 환경 변수 $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
. wc
with sed
또는 의 출력을 후처리하는 대신 옵션을 사용하여 단어 수를 얻을 cut
수 있습니다 .-w
su - root -c 'echo $HOME | wc -w'