ท่อ Linux, ข้อความเตือน, stdout


3

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

เมื่อคำสั่งรันได้สำเร็จ

root@local# apcaccess status
APC : 700
VERSION : xxxxx
BATTSTAT : AC

เมื่อคำสั่งผิดพลาด

root@local# apcaccess status
apcupsd @ localhost: Connection Refused.

root@local# apcaccess status | grep -i version
apcupsd @ localhost: Connection Refused.

ฉันสังเกตเห็นเมื่อฉันพยายามที่จะไพพ์คำสั่งผ่านสถานะ apcaccess ของ grep ' grep -i version 'ฉันจะได้รับหมายเลขเวอร์ชั่นในการดำเนินการที่ประสบความสำเร็จ แต่ในระบบที่ข้อผิดพลาดเกิดขึ้นฉันจะได้รับข้อความแสดงข้อผิดพลาด ฉันเชื่อว่ามันไม่ผ่านมาตรฐาน

คำถามคือฉันจะบังคับให้ส่งออกไปยัง goto stdout ได้อย่างไร

คำตอบ:


6
# apcaccess status 2>&1 | grep -i version

สิ่งนี้จะเปลี่ยนเส้นทาง stderr ไปยัง stdout ดังนั้น grep จะเห็นผลลัพธ์


คุณจะพบเคล็ดลับนี้มีประโยชน์ในที่อื่นเช่นกัน ตัวอย่างเช่นบางรายการ - ช่วยเหลือไปที่ stderr แทนที่จะเป็น stdout บังคับให้คุณ: foobar --help 2> & 1 | น้อยลง
Twirrim

2

เหตุผลก็คือมีตัวอธิบายไฟล์สองตัวเปิดขึ้นมาซึ่ง "พิมพ์" บนหน้าจอของคุณ stdout (แสดงโดย file descriptor 1) และ stderr (file descriptor 2) เมื่อคุณไพพ์คำสั่งหนึ่งไปยังอีกคำสั่งคุณเพียงแค่ใช้ stdout จากคำสั่งแรกและ "ไพพ์" มันเป็น stdin ไปยังคำสั่งที่สอง แต่ถ้าคำสั่งแรกพิมพ์บางสิ่งไปยัง stderr (โดยปกติแล้วจะเป็นข้อความแสดงข้อผิดพลาด) กว่านั้นจะไม่ถูกส่งผ่านไปป์ แต่พิมพ์โดยตรงไปยังหน้าจอของคุณ

ดังนั้นคุณต้องเปลี่ยนเส้นทาง stderr ไปยัง stdout ประสบความสำเร็จดังต่อไปนี้

command1 2> & 1 | Command2

Protips: เหตุผลที่เครื่องหมายแอมเปอร์แซนด์จำเป็นเพราะคุณต้องบอกว่าคุณเปลี่ยนเส้นทาง stderr (2) ไปที่file descriptor stdout (1) มิฉะนั้นจะไม่มีเครื่องหมายและคุณเพียงแค่บอก stderr ให้เปลี่ยนเส้นทางไปยังไฟล์ชื่อ '1' ในไดเรกทอรีการทำงานปัจจุบัน คล้ายกับสิ่งที่คุณอาจทำเมื่อคุณดัมพ์ "เอาต์พุต" ของคำสั่ง (stdout) ไปยังไฟล์ผ่าน 'command> myfile.log' การวางไม่มีตัวให้คำอธิบายไฟล์ไว้ด้านหน้าของคำสั่งการเปลี่ยนเส้นทางเป็นค่าเริ่มต้นที่ 1 (stdout)

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