ฉันมีสคริปต์ Bash ที่รันโปรแกรมด้วยพารามิเตอร์ โปรแกรมนั้นแสดงสถานะบางสถานะ ไม่มีตัวเลือกใด ๆ สำหรับโปรแกรมนี้ที่จะเงียบ ฉันจะป้องกันไม่ให้สคริปต์แสดงสิ่งใดได้อย่างไร
ฉันมีสคริปต์ Bash ที่รันโปรแกรมด้วยพารามิเตอร์ โปรแกรมนั้นแสดงสถานะบางสถานะ ไม่มีตัวเลือกใด ๆ สำหรับโปรแกรมนี้ที่จะเงียบ ฉันจะป้องกันไม่ให้สคริปต์แสดงสิ่งใดได้อย่างไร
คำตอบ:
ข้อมูลต่อไปนี้ส่งเอาต์พุตมาตรฐานไปยังอุปกรณ์ null (ที่ฝากข้อมูลบิต)
scriptname >/dev/null
และถ้าคุณต้องการส่งข้อความแสดงข้อผิดพลาดให้ใช้หนึ่งในนั้น (อันแรกอาจใช้ไม่ได้ในทุกเชลล์):
scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null
และหากคุณต้องการบันทึกข้อความ แต่ไม่เห็นให้แทนที่/dev/nullด้วยไฟล์จริงเช่น:
scriptname &>scriptname.out
เพื่อความสมบูรณ์ภายใต้ Windows cmd.exe (โดยที่ "nul" เทียบเท่ากับ "/ dev / null") มันคือ:
scriptname >nul 2>nul
echo foo > $(tty)สคริปต์และเรียกใช้./test.sh &> /dev/null- เอาต์พุตยังคงถูกพิมพ์ไปยังเทอร์มินัล แน่นอนว่านี่ไม่ใช่ปัญหาหากคุณกำลังเขียนสคริปต์ที่ไม่ใช้คำสั่งดังกล่าว
/dev/nullอยู่ใน Cygwin nulคุณไม่จำเป็นต้องใช้
สิ่งที่ต้องการ
script > /dev/null 2>&1
ซึ่งจะช่วยป้องกันการส่งออกมาตรฐานและ/dev/nullออกข้อผิดพลาดเปลี่ยนเส้นทางไปยังพวกเขาทั้งสอง
2>/dev/null
ลอง
: $(yourcommand)
: สั้นสำหรับ "ไม่ทำอะไรเลย"
$() เป็นเพียงคำสั่งของคุณ
0(สำเร็จ) ลองดูตัวอย่างโดยใช้คำสั่งfalseที่ส่งคืน1(ล้มเหลว) เสมอ ยกตัวอย่างเช่นการแสดง( echo foo | tee file ; false ) && echo bar fooใช้เคล็ดลับของคุณเพื่อระงับการแสดงผล: ( : $(echo foo | tee file ; false) ) && echo bar. แต่มันจะแสดงbarความหมายว่ารหัสสถานะการส่งคืนคือ0(นี่ไม่ใช่รหัสสถานะที่ส่งคืนจากfalse) โปรดอัปเดตคำตอบของคุณโดยให้ข้อ จำกัด นี้ ไชโย
DUMMY=$(yourcommand)อะไร ไม่มีข้อ จำกัด ที่คุณได้กล่าวถึง :)
DUMMY=$( echo foo | tee file ; false ) && echo barไม่แสดงผลใด ๆ และคำสั่งDUMMY=$( echo foo | tee file ; true ) && echo barจะปรากฏbarขึ้น แจ้งให้เราทราบหากคุณให้คำตอบเพื่อ upvote ;-) ไชโย
ทางเลือกที่อาจเหมาะสมในบางสถานการณ์คือการกำหนดผลลัพธ์ของคำสั่งให้กับตัวแปร:
$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1
เนื่องจาก Bash และล่าม commandline POSIX อื่น ๆ ไม่ได้พิจารณาการกำหนดตัวแปรเป็นคำสั่งจึงมีการเคารพรหัสส่งคืนของคำสั่งปัจจุบัน
หมายเหตุ: การมอบหมายด้วยtypesetหรือdeclareคีย์เวิร์ดถือเป็นคำสั่งดังนั้นโค้ดส่งคืนที่ประเมินค่าในกรณีนี้คือการกำหนดเองและไม่ใช่คำสั่งที่เรียกใช้งานในเชลล์ย่อย:
$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0
เช่นเดียวกับโพสต์ของ andynormancxให้ใช้สิ่งนี้ (หากคุณทำงานในสภาพแวดล้อม Unix):
scriptname > /dev/null
หรือคุณสามารถใช้สิ่งนี้ (หากคุณทำงานในสภาพแวดล้อม Windows):
scriptname > nul
> nulบน Windows ที่มี cygwin หรือ git bash และตอนนี้คุณติดอยู่กับnulไฟล์ที่ไม่สามารถลบได้โปรดลองตอบคำถามนี้ดูมันใช้งานได้ดี
ดูตัวอย่างจากโครงการเอกสารลินุกซ์ :
3.6 ตัวอย่าง: ไฟล์ stderr และ stdout 2
สิ่งนี้จะทำทุกเอาต์พุตของโปรแกรมไปยังไฟล์ บางครั้งสิ่งนี้เหมาะสำหรับรายการ cron หากคุณต้องการให้คำสั่งส่งผ่านไปในความเงียบสนิท
rm -f $(find / -name core) &> /dev/null
ที่กล่าวว่าคุณสามารถใช้การเปลี่ยนเส้นทางแบบง่าย ๆ นี้:
/path/to/command &>/dev/null
ในสคริปต์ของคุณคุณสามารถเพิ่มสิ่งต่อไปนี้ลงในบรรทัดที่คุณรู้ว่ากำลังจะให้ผลลัพธ์:
some_code 2>>/dev/null
หรือมิฉะนั้นคุณสามารถลอง
some_code >>/dev/null
>>)