ฉันกำลังเขียนสคริปต์ทุบตีที่ฉันต้องการออกหากผู้ใช้ไม่ได้รูท เงื่อนไขทำงานได้ดี แต่สคริปต์ไม่ออก
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
ฉันลองใช้&&
แทนที่จะใช้;
แต่ไม่ได้ผล
ฉันกำลังเขียนสคริปต์ทุบตีที่ฉันต้องการออกหากผู้ใช้ไม่ได้รูท เงื่อนไขทำงานได้ดี แต่สคริปต์ไม่ออก
[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)
ฉันลองใช้&&
แทนที่จะใช้;
แต่ไม่ได้ผล
คำตอบ:
คุณสามารถทำเช่นนี้ได้:
[[ $(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; }
(การประเมินผลทางคณิตศาสตร์สำหรับการทดสอบครั้งแรก)
สังเกตเห็นการเปลี่ยนแปลง()
-> {}
- วงเล็บปีกกาไม่วางไข่ subshell (ค้นหาman bash
"subshell")
[[
((
[[
ดีตราบใดที่คุณใช้แทน-eq
==
(( EUID )) && ...
วงเล็บรอบคำสั่งดังกล่าวจะสร้างsubshell eshos ย่อยของคุณ "ต้องเป็น root ในการเรียกใช้สคริปต์" จากนั้นคุณบอกให้subshellออก (แม้ว่าจะมีอยู่แล้วเนื่องจากไม่มีคำสั่งเพิ่มเติม) วิธีที่ง่ายที่สุดในการแก้ไขอาจเป็นเพียงการใช้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
หนึ่งวิธีการแก้ปัญหาที่เป็น
ด้วยทุบตี :
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
echo
ล้มเหลว (เช่นเนื่องจาก stdout ไม่สามารถเขียนได้)
วงเล็บที่อยู่รอบ ๆ||
และ&&
ไม่จำเป็นเนื่องจากเป็นสิ่งที่เกี่ยวข้องกัน สองนิพจน์ต่อไปนี้เทียบเท่ากัน:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
ดังนั้น&&
แทนที่จะ;
ทำงานได้ดีเหมือนecho
จะกลับมาจริง
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
สิ่งนี้อาจช่วยคุณได้ในการทุบตี
[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
เพื่อให้เข้าใจถึงกระบวนการหลักที่เกิดปัญหาขึ้น