답변:
당신은 이런 식으로 할 수 있습니다 :
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
(첫 번째 명령문에서 산술 이진 연산자를 사용하는 "일반"조건식) 또는
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(첫 번째 테스트의 산술 평가).
변경 ()
-> {}
-중괄호 는 서브 쉘을 생성 하지 않습니다 . ( man bash
"서브 쉘"을 검색하십시오 .)
[[
숫자 비교에는 사용 하지 말고을 사용하십시오 ((
.
[[
사용 -eq
하는 한 괜찮습니다 ==
.
(( EUID )) && ...
이러한 명령 주위의 괄호는 서브 쉘을 작성합니다 . 서브 쉘은 "스크립트를 실행하려면 루트 여야합니다"를 에코 한 다음 서브 쉘 에 종료 명령을 내립니다 (명령이 더 이상 없기 때문에 이미 종료 했음 ). 그것을 해결하는 가장 쉬운 방법은 아마도 if
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
id -u == 0
, 당신이 것을 의미하는 있는 루트. 당신은 원합니다 [[ $(id -u) != 0 ]]; then
.
[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
또한 $UID
프로세스 생성을 저장하는을 참고하십시오 . 당신도 좋아할 것 같아요 $EUID
.
((UID)) && echo 'You have to be root.' && exit 1
.
set -e
중단 될 수 있습니다 . 그 문제에 대한 한 가지 해결책은 [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
입니다.
와 bash는 :
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
echo
않습니다 (예 : stdout이 쓰기 가능하지 않기 때문에).
주변 브래킷 ||
및 &&
이들로 필요하지 않습니다 마우스 오른쪽 연관됩니다. 다음 두 표현식은 동일합니다.
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
따라서 true &&
대신에 ;
잘 작동 echo
합니다.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
이것은 bash에서 도움이 될 수 있습니다.
[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
"
exit
fi
exit 1
문제가 발생한 상위 프로세스를 이해하려면 0이 아닌 다른 코드로 종료하십시오 .