ฉันมีสคริปต์ 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
>>
)