การซ่อนเอาต์พุตของคำสั่งเชลล์มักเกี่ยวข้องกับการเปลี่ยนเส้นทาง stderr และ stdout มีสิ่งอำนวยความสะดวก builtin หรือคำสั่งซึ่งโดยปกติแล้วซ่อนเอาท์พุท แต่เมื่อเกิดข้อผิดพลาดจะทิ้งเอาท์พุทสะสมทั้งหมดหรือไม่ ฉันต้องการเรียกใช้สิ่งนี้เป็น wrapper สำหรับssh
คำสั่งระยะไกล ตอนนี้ฉันมีพวกเขาใช้การเปลี่ยนเส้นทาง แต่ฉันไม่เข้าใจว่าอะไรทำให้พวกเขาล้มเหลวและพวกเขาก็ verbose เกินไป
แก้ไข:ในที่สุดฉันสร้างแม่แบบต่อไปนี้ตามคำตอบโดย @Belmin ซึ่งฉัน tweaked เล็กน้อยเพื่อสะสมคำสั่งก่อนหน้าทั้งหมดจากสคริปต์ใช้ตัวระบุกระบวนการปัจจุบันลบบันทึกโดยอัตโนมัติและเพิ่มข้อผิดพลาดสีแดงล้มเหลว ข้อความเมื่อมีข้อผิดพลาดเกิดขึ้น ในเทมเพลตนี้silent
wrapper เริ่มต้นจะสำเร็จจากนั้นให้คำสั่งที่สามล้มเหลวเนื่องจากมีไดเรกทอรีอยู่แล้ว:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
สิ่งที่ต้องการ:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit