Tôi đã theo dõi một số câu hỏi tương tự (chẳng hạn như How to set a variable to the output from a command in Bash?), tuy nhiên các câu trả lời được chấp nhận dường như không hoạt động đối với tôi. Tôi đã không chắc chắn liệu tôi có nên làm hỏng câu hỏi của người khác hoặc đăng bản sao của riêng tôi hay không, vì vậy xin lỗi nếu tôi chọn sai ở đây.Cách lấy đầu ra của lệnh bash trong biến
Tôi muốn có được trạng thái đầu ra và thoát của một số lệnh trong một tập lệnh mà tôi đang tập hợp lại. Dưới đây là một ví dụ về những gì tôi đã được sử dụng:
cmd_output=$(rm $file)
exit_status=$?
if [ "${exit_status}" -eq 0 ]
then
log "Successfully removed the original" ${TAB_LEVEL}
else
fail "Failed to remove the original, the output was: \n ${cmd_output}"
fi
Nhật ký và thất bại chức năng bao gồm:
# Usage: fail "Failure message"
function fail {
echo "FATAL ERROR: $1" >> "${LOG_DIR}/${LOG_FILE}"
exit 1
}
# Usage: log "Log message" 3 Where the tab-level is 3.
function log {
if (("${2}" > 0))
then
eval "printf ' %.0s' {1..$2}" >> "${LOG_DIR}/${LOG_FILE}"
fi
echo "$1" >> "${LOG_DIR}/${LOG_FILE}"
return 0
}
Trong ví dụ trên, chúng tôi sử dụng định dạng $ (cmd), nhưng tôi cũng đã cố gắng sử dụng backticks.
Trong log file của tôi, tất cả tôi thấy khi có một thất bại là:
FATAL ERROR: Failed to remove the original, the output was: \n
Ngoài ra, đầu ra của các lệnh thất bại kết thúc lên trên màn hình như bình thường. Có một lý do phổ biến mà các biến cmd_output của tôi sẽ còn trống không?
Vui mừng khi đẩy bạn vượt mốc 1000, tiếp tục đăng! – shellter
Hey Janito, Cảm ơn rất nhiều vì câu trả lời của bạn! Tôi biết về ba luồng tiêu chuẩn và các toán tử chuyển hướng, nhưng lý do duy nhất tôi đã sử dụng chúng cho đến nay là gửi mọi thứ từ một lệnh đến/dev/null hoặc tới một tệp nhật ký. Tôi thậm chí không xem xét các luồng khác nhau ở đây. Biến $ file thực sự ban đầu trong dấu ngoặc kép, tôi lấy nó ra khỏi các dấu ngoặc kép khi tôi thử nghiệm các chức năng bắt lỗi của tập lệnh của tôi, để ép buộc lỗi. Một lần nữa, cảm ơn rất nhiều! –