ฉันกำลังทำงานกับเชลล์สคริปต์ที่ทำการเปลี่ยนแปลงบางอย่างในไฟล์ txt เฉพาะในกรณีที่มีอยู่อย่างไรก็ตามลูปทดสอบนี้ใช้ไม่ได้ฉันสงสัยว่าทำไม? ขอบคุณ!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
ฉันกำลังทำงานกับเชลล์สคริปต์ที่ทำการเปลี่ยนแปลงบางอย่างในไฟล์ txt เฉพาะในกรณีที่มีอยู่อย่างไรก็ตามลูปทดสอบนี้ใช้ไม่ได้ฉันสงสัยว่าทำไม? ขอบคุณ!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
คำตอบ:
เมื่อคุณพูดว่า "ใช้ไม่ได้" คุณจะรู้ได้อย่างไรว่ามันใช้ไม่ได้?
คุณอาจลองดูว่าไฟล์นั้นมีอยู่จริงหรือไม่โดยเพิ่ม:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
คุณอาจตรวจสอบให้แน่ใจว่าคุณใช้ Bash (หรือที่เกี่ยวข้อง) เชลล์โดยพิมพ์ 'echo $ SHELL' ฉันคิดว่า CSH และ TCSH ใช้ความหมายที่แตกต่างกันเล็กน้อยสำหรับลูปนี้
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
หากคุณใช้ linux และติดตั้ง inotify-tools ไว้คุณสามารถทำได้:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
ซึ่งจะช่วยลดความล่าช้าที่เกิดจากการนอนหลับขณะที่ยังคงสำรวจทุกๆ "x" วินาที คุณสามารถเพิ่มกิจกรรมอื่น ๆ ได้หากคุณคาดว่าจำเป็น
--exclude
ต้องกรองชื่อไฟล์ออก แต่--include
ต้องไม่เพิกเฉยต่อทุกสิ่งยกเว้นชื่อไฟล์ คำสั่งดังกล่าวควรใช้-qq
อาร์กิวเมนต์แทน>&/dev/null
แม้ว่า
--timeout
ความถี่ในการตรวจสอบไม่ใช่หรือ? ประเด็นของ inotifywait คือไม่มีการหยั่งเสียง
inotifywait
อาจแฮงค์ไปเรื่อย ๆ หากไฟล์ถูกสร้างขึ้นก่อนที่จะเริ่มฟังเหตุการณ์
ฉันมีปัญหาเดียวกันใส่! นอกวงเล็บ;
while ! [ -f /tmp/list.txt ];
do
echo "#"
sleep 1
done
นอกจากนี้หากคุณเพิ่มเสียงสะท้อนภายในลูปมันจะบอกคุณว่าคุณกำลังเข้าสู่ลูปหรือไม่
ฉันพบปัญหาที่คล้ายกันและมันทำให้ฉันมาที่นี่ดังนั้นฉันแค่อยากจะทิ้งวิธีแก้ปัญหาไว้สำหรับทุกคนที่ประสบปัญหาเดียวกัน
ฉันพบว่าถ้าฉันรันcat /tmp/list.txt
ไฟล์จะว่างเปล่าแม้ว่าฉันจะแน่ใจว่ามีเนื้อหาถูกวางไว้ในไฟล์ทันที ปรากฎว่าถ้าฉันใส่sleep 1;
ก่อนที่cat /tmp/list.txt
มันจะทำงานตามที่คาดไว้ ต้องมีความล่าช้าระหว่างเวลาที่สร้างไฟล์และเวลาที่เขียนหรือมีบางอย่างตามบรรทัดเหล่านั้น
รหัสสุดท้ายของฉัน:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
หวังว่านี่จะช่วยประหยัดเวลาครึ่งชั่วโมงที่น่าผิดหวังของใครบางคน!
เช่นเดียวกับ @ zane-hooper ฉันมีปัญหาคล้ายกันใน NFS บนระบบไฟล์แบบขนาน / แบบกระจายความล่าช้าระหว่างคุณสร้างไฟล์ในเครื่องหนึ่งและอีกเครื่อง "เห็น" ไฟล์อาจมีขนาดใหญ่มากดังนั้นฉันจึงสามารถรอได้ถึงหนึ่งนาทีเต็มหลังจากสร้างไฟล์ก่อนที่ลูป while จะออก (และ นอกจากนี้ยังมีผลที่ตามมาจากการ "เห็น" ไฟล์ที่ลบไปแล้ว)
สิ่งนี้สร้างภาพลวงตาว่าสคริปต์ "ใช้งานไม่ได้"ในขณะที่จริงๆแล้วมันเป็นระบบไฟล์ที่ปล่อยลูกบอล
ฉันใช้เวลาพอสมควรในการคิดออกหวังว่ามันจะช่วยใครสักคนได้บ้าง
ป.ล. สิ่งนี้ทำให้เกิดข้อผิดพลาด "ตัวจัดการไฟล์เก่า" ที่น่ารำคาญ
ทำงานร่วมกับ bash และ sh ทั้งสอง:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
นี่คือเวอร์ชันที่มีการหมดเวลาดังนั้นหลังจากผ่านไประยะหนึ่งลูปจะสิ้นสุดลงด้วยข้อผิดพลาด:
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
ทำแบบนี้
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt