หวังว่ามันจะโอเคที่จะทราบสิ่งนี้ตอนนี้ที่ฉันได้พบมัน:
ฉันทราบอยู่แล้วว่าสามารถทดสอบการมีอยู่ของไฟล์โดยใช้คำสั่งtest
( [
):
$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no
... แต่มันพิมพ์นิดหน่อยตรง:)
นั้นฉันเลยหลงทางถ้ามีคำสั่งเดียว "ปริยาย" ที่จะคืนค่าการมีอยู่ของไฟล์ให้stdout
?
ฉันยังสามารถใช้test
กับสถานะออก$?
:
$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1
... แต่นี่ยังคงเป็นสองคำสั่ง - และตรรกะก็เป็น "สิ่งที่ตรงกันข้าม" (0 สำหรับความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลว)
เหตุผลที่ฉันถามคือฉันต้องทดสอบการมีอยู่ของไฟล์gnuplot
ซึ่ง " system("command")
ส่งคืนสตรีมอักขระที่เป็นผลลัพธ์จาก stdout เป็นสตริง "; ในgnuplot
ฉันสามารถทำโดยตรง:
gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes
ดังนั้นโดยทั่วไปฉันต้องการที่จะสามารถเขียนสิ่งนี้ (หลอก):
gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
yes
... น่าเสียดายที่ผมไม่สามารถใช้โดยตรงผ่านทางtest
และ$?
:
gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
no
... ฉันต้องกลับเหตุผล
ดังนั้นโดยทั่วไปฉันต้องคิดวิธีแก้ไขสคริปต์แบบกำหนดเอง (หรือเขียนสคริปต์แบบอินไลน์เป็นหนึ่งซับ) ... และฉันคิดว่าถ้ามีคำสั่งเริ่มต้นที่สามารถพิมพ์ 0 หรือ 1 (หรือ ข้อความที่กำหนดเอง) เพื่อ stdout สำหรับการมีอยู่ของไฟล์จากนั้นฉันไม่ต้องทำ :)
(โปรดทราบว่าls
อาจเป็นตัวเลือก แต่เอาต์พุต stdout นั้นละเอียดเกินไปและถ้าฉันต้องการหลีกเลี่ยงสิ่งนั้นฉันจะต้องระงับเอาต์พุตทั้งหมดและกลับสถานะที่มีอยู่อีกครั้งดังเช่นใน
$ ls exists.file 1>/dev/null 2>/dev/null ; echo $?
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $?
2
... แต่นั่นเป็นอีกสองคำสั่ง (และการพิมพ์ที่มากขึ้น) และตรรกะ "inverted" ... )
ดังนั้นมีคำสั่งเริ่มต้นเดียวที่สามารถทำได้ใน Linux?
( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"
ล่ะ