เหตุใด 'คำสั่ง nohup> & / dev / null' จึงดูเหมือน "ทำงาน" ในเชลล์บางตัว


12

ฉันแก้ไขคำตอบบน Ask Ubuntu ที่แนะนำต่อไปนี้

nohup gedit >& /dev/null & 

เมื่อพวกเขาตั้งใจจริง

nohup gedit &> /dev/null & 

หลังได้อย่างถูกต้องเปลี่ยนเส้นทางทั้ง stderr และ stdout /dev/nullไป ฉันคาดหวังว่าอดีตจะสร้างไฟล์ชื่อ&หรือมีแนวโน้มที่จะให้ข้อผิดพลาดเช่นเดียวกับกรณีอื่น ๆ :

$ echo "foo" >& 
bash: syntax error near unexpected token `newline'

แต่ดูเหมือนว่ามันจะทำงานในลักษณะเดียวกับที่เคยเป็นมาก่อนgeditหน้าต่างปรากฏขึ้นและไม่มีการพิมพ์ข้อความแสดงข้อผิดพลาด

ฉันควรทราบด้วยว่านี่เป็นเชลล์เฉพาะ:

  • bash(4.2.45 (1) -release), zsh(5.0.2), csh(เวอร์ชั่นแพ็คเกจ deb: 20110502-2) และtcsh(6.18.01): ทำงานตามที่อธิบายไว้ข้างต้นไม่มีข้อความแสดงข้อผิดพลาดไม่มีไฟล์ที่สร้างขึ้น

  • dash (0.5.7-3):

    $ nohup gedit >& /dev/null & 
    $ dash: 2: Syntax error: Bad fd number
    
  • ksh(93u + 2012-08-01): ล้มเหลว แต่กระบวนการนั้นเริ่มต้นชัดเจน ( 1223) แม้ว่าจะไม่มีgeditหน้าต่างปรากฏขึ้น:

    $ nohup gedit >& /dev/null & 
    [1] 1223
    $ ksh: /dev/null: bad file unit number
    
  • fish (2.0.0):

    > nohup gedit >& /dev/null & 
    fish: Requested redirection to something that is not a file descriptor /dev/null
    nohup gedit >& /dev/null & 
                   ^
    

ดังนั้นทำไมคำสั่งนี้จึงรันโดยไม่มีข้อผิดพลาด (และไม่มีไฟล์เอาต์พุตที่สร้างขึ้น) ในเชลล์บางตัวและล้มเหลวในเชลล์อื่น ๆ การ>&ทำในกรณีพิเศษที่เห็นได้ชัดnohupคืออะไร? ฉันเดาว่า>& /dev/nullมันถูกตีความว่าเป็น>&/dev/nullแต่ทำไมพื้นที่ไม่ได้ทำให้เกิดข้อผิดพลาดในเชลล์เหล่านี้?


ในเครื่องของฉัน Ubuntu 12.04 dashคำสั่งนี้ทำงานได้ตามปกติสำหรับ
cuonglm

nohup commandเรียก TTY อิสระ application.According ของคุณไปยังหน่วยความจำของฉันdashขยายash, Debian ash, ashพัฒนาโดยOpenBSDและก็เปลือก จำกัด แม้ Maemo OS (Debian ฐานบนมือถือ N900) ใช้ประashเปลือกครอบครัวได้รับการ จำกัด การใช้งานที่คาดหวังจากการทุบตีหรือ tcsh
PersianGulf

@Gnouc huh อาจเป็นรุ่นอื่น (ฉันใช้ Debian)? ฉันไม่สามารถหาวิธีทำให้รุ่นของฉันdashพิมพ์ออกมาได้ แต่แพ็คเกจคือ0.5.7-3คุณเป็นใคร นอกจากนี้คุณแน่ใจหรือว่าคุณกำลังใช้งานdash? นั่นเป็นค่าเริ่มต้นของ Ubuntu shใช่ไหม?
terdon

@MohsenPahlevanzadeh ฉันไม่แน่ใจว่าประเด็นของคุณคืออะไรฉันรู้ว่าอะไรnohupคำถามของฉันคือสาเหตุที่>&ดูเหมือนว่าจะทำงานกับ nohup เพียงอย่างเดียวในเปลือกหอยบางอย่าง
terdon

คุณสามารถใช้ลิงค์ต่อไปนี้เพื่อดู abstarct ของ shells: unix.stackexchange.com/questions/45684/ …
PersianGulf

คำตอบ:


18
nohup gedit &> /dev/null

คือ POSIX ไวยากรณ์และเหมือนกับ:

nohup gedit &
> /dev/null

ที่ทำงานnohup geditในพื้นหลังแล้วทำการ> /dev/nullเปลี่ยนเส้นทางโดยไม่ต้องใช้คำสั่ง

nohup gedit >& /dev/null

ไม่ใช่ POSIX ไวยากรณ์และเป็นcshวิธีเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยัง / dev / null cshไม่มีตัว2>&1ดำเนินการตามที่พบใน Bourne ดังนั้นจึงเป็นวิธีเดียวที่cshจะเปลี่ยนเส้นทาง stderr

zsh(บ่อยครั้ง) ให้กับcshไวยากรณ์ แต่ก็ยังสนับสนุนผู้ประกอบการx>&y ทำสำเนา fdของบอร์นเชลล์ซึ่งหมายความว่ามีความขัดแย้ง

ls >&file

เปลี่ยนเส้นทางlsของ stdout และ stderr ไปที่fileแต่ถ้าไฟล์นั้นแสดง2ว่าคุณมีปัญหา

ls >&2

หมายถึงเปลี่ยนเส้นทาง stdout ไปยังทรัพยากรที่ชี้ไปโดย fd 2 ( dup(2, 1)) ดังนั้นคุณต้องเขียนมัน:

ls >& ./2

หากคุณต้องการเปลี่ยนเส้นทางทั้ง stdout และ stderr ของlsลงในไฟล์ที่เรียกว่า2ในไดเรกทอรีปัจจุบัน หรือใช้ไวยากรณ์มาตรฐาน

bashเริ่มแรกไม่เข้าใจ>&แต่มันแนะนำตัว&>ดำเนินการแทนสำหรับสิ่งนั้นซึ่งทำลายการปฏิบัติตาม POSIX ในกระบวนการ (แม้ว่าจะไม่น่าเป็นไปได้ที่สคริปต์จะใช้cmd &> xxx)

kshคัดลอกว่าผู้ประกอบการใน ksh93t + ในปี 2009 ใน mksh R35 ในปี 2008 (ปิดใช้งานในposixโหมด) >&แต่ไม่

bashเพิ่มการสนับสนุนสำหรับ>&ใน 2.05

busybox shเพิ่มการสนับสนุนสำหรับทั้งใน&>และ>&1.13 (2008)

ทั้ง>&มิได้&>เป็นความหมายเปลี่ยนเส้นทาง stdout และ stderr มี POSIX / บอร์น

หากคุณต้องการเปลี่ยนเส้นทางทั้ง stdout และ stderr portably ไวยากรณ์คือ

cmd > file 2>&1

คุณหมายถึง Bash in POSIX/Bourneโดย "Bourne" หรือเปล่า
Pandya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.