จะเงียบเอาต์พุตใน Bash script ได้อย่างไร


149

ฉันมีโปรแกรมที่ส่งออกไปยัง stdout และต้องการเงียบผลลัพธ์นั้นในสคริปต์ Bash ในขณะที่ไพพ์ไปยังไฟล์

ตัวอย่างเช่นการรันโปรแกรมจะส่งออก:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

ฉันต้องการสคริปต์ต่อไปนี้เพื่อไม่ส่งออกอะไรไปยังสถานี

#!/bin/bash
myprogram > sample.s

จากสิ่งที่ฉันจำได้การเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ทำให้ไม่ถูกสะท้อนไปยังเทอร์มินัล คุณไม่ได้ทำงานอะไร
อานนท์


คำตอบ:


187

หากมันส่งออกไปยัง stderr เช่นกันคุณจะต้องเงียบไป คุณสามารถทำได้โดยเปลี่ยนเส้นทางไฟล์อธิบาย 2:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
บรรทัด "&>" เป็นเวอร์ชันที่สั้นกว่าของสิ่งที่ฉันเพิ่งโพสต์ ฉันไม่เคยเจอทางลัดนั้นมาก่อน Upvoting
chradcliffe

5
&>มีอายุมากกว่าทุบตีมาก 4
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams คุณสามารถเชื่อมโยงการเปลี่ยนแปลงเอกสาร&>แนะนำการเปลี่ยนแปลงได้หรือไม่? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 เป็นการระบุว่า>>&มีการนำมาใช้ใน 4.0 ไม่มีการกล่าวถึง&>แต่การเปลี่ยนแปลงกลับไปเป็น 2.0 เท่านั้นดังนั้นฉันคิดว่านั่นหมายความว่ามันเป็น 1.x อยู่แล้ว
tripleee

git blameบนredir.cจุด 1998 กระทำสำหรับเหตุการณ์ที่เก่าแก่ที่สุดยังอยู่ในฐานรหัสปัจจุบัน
tripleee

60

เปลี่ยนเส้นทาง stderr ไปยัง stdout

สิ่งนี้จะเปลี่ยนเส้นทาง stderr (ซึ่งเป็น descriptor 2) ไปยัง file descriptor 1 ซึ่งเป็น stdout

2>&1

เปลี่ยนเส้นทาง stdout เป็น File

ตอนนี้เมื่อดำเนินการนี้คุณจะเปลี่ยนเส้นทาง stdout ไปยังไฟล์ sample.s

myprogram > sample.s

เปลี่ยนเส้นทาง stderr และ stdout เป็น File

การรวมสองคำสั่งจะส่งผลให้เปลี่ยนเส้นทางทั้ง stderr และ stdout เป็น sample.s

myprogram > sample.s 2>&1

เปลี่ยนเส้นทาง stderr และ stdout เป็น / dev / null

เปลี่ยนเส้นทางไปที่/dev/nullหากคุณต้องการปิดเสียงแอปพลิเคชันของคุณโดยสมบูรณ์

myprogram >/dev/null 2>&1

13
อันสุดท้ายไม่มีตัวดำเนินการเปลี่ยนเส้นทาง มันควรจะเป็นmyprogram >/dev/null 2>&1(สังเกตเห็นลิ่มก่อน/dev/nullและลำดับของการเปลี่ยนเส้นทาง)
tripleee

2
จะไม่myprogram &>/dev/nullเพียงพอหรือ
JaviOverflow

38

ผลผลิตทั้งหมด:

scriptname &>/dev/null

พกพา:

scriptname >/dev/null 2>&1

พกพา:

scriptname >/dev/null 2>/dev/null

สำหรับ bash ที่ใหม่กว่า (ไม่มีอุปกรณ์พกพา):

scriptname &>-

มันใช้งานไม่ได้ จริง ๆ แล้วมันสร้างชื่อไฟล์-และ&>เป็นส่วนขยายของเชลล์ที่ไม่ใช่แบบพกพา
PhilT

การเทียบเท่าแบบพกพาecho moo 1>&-สร้างข้อผิดพลาดเนื่องจาก file descriptor 1 ถูกปิด:-bash: echo: write error: Bad file descriptor
tripleee

11

หากคุณต้องการ STDOUT และ STDERR ทั้ง [ทุกอย่าง] วิธีที่ง่ายที่สุดคือ:

#!/bin/bash
myprogram >& sample.s

จากนั้นเรียกใช้งานเช่น./scriptนี้และคุณจะไม่ได้รับผลลัพธ์ใด ๆ :)

"> &" หมายถึง STDERR และ STDOUT &ยังทำงานในลักษณะเดียวกันกับท่อ: ./script |& sed ว่าจะส่งทุกอย่างเพื่อ sed


7
man bash (ภายใต้ "การเปลี่ยนเส้นทางเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐาน") ระบุว่า &> และ> & เทียบเท่า แต่แรก (&>) เป็นที่ต้องการ อย่างไรก็ตาม | & เป็นวิธีเดียวที่จะทำเช่นนี้กับท่อ
John Mellor

1
@ John No, วิธีพกพาสำหรับไปป์a 2>&1 | b 2>&1 | c
tripleee

9

หากคุณยังคงดิ้นรนเพื่อหาคำตอบโดยเฉพาะอย่างยิ่งถ้าคุณสร้างไฟล์สำหรับเอาท์พุทและคุณต้องการทางเลือกที่ชัดเจน: echo "hi" | grep "use this hack to hide the oputut :) "


2
แฮ็คที่น่าสนใจ ... การถอนรากถอนโคนสำหรับความฉลาด ^ _ ^
skplunkerin


0

หมายเหตุ: คำตอบนี้เกี่ยวข้องกับคำถาม "วิธีปิดเสียงสะท้อนขณะดำเนินการเชลล์สคริปต์ Linux" ซึ่งถูกทำเครื่องหมายว่าทำซ้ำกับสำเนานี้

ในการปิด echo จริง ๆ คำสั่งคือ:

stty-echo

(นี่คือตัวอย่างเช่นเมื่อคุณต้องการป้อนรหัสผ่านและคุณไม่ต้องการให้อ่านได้โปรดจำไว้ว่าให้เปิดเสียงสะท้อนเมื่อสิ้นสุดสคริปต์ของคุณมิฉะนั้นบุคคลที่เรียกใช้สคริปต์ของคุณจะไม่เห็นสิ่งที่เขาทำ / เธอพิมพ์จากนั้นเป็นต้นไปหากต้องการเปิดเสียงสะท้อนเมื่อทำงาน:

เสียงสะท้อน


0

มีประโยชน์ในสคริปต์:


รับ STDERR เพียงไฟล์เดียวในขณะที่ซ่อน STDOUT ใด ๆแม้ว่าโปรแกรมที่จะซ่อนจะไม่มีอยู่เลย (ไม่เคยหยุดสคริปต์ผู้ปกครอง) อยู่คนเดียวตอนนี้ทำงาน:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

แยกออกอย่างสมบูรณ์และเงียบทุกอย่างแม้แต่การฆ่าสคริปต์ผู้ปกครองจะไม่ยกเลิก./prog:

 ./prog </dev/null >/dev/null 2>&1 &

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