Bash
將 tty 重定向到標準
我有一個在 上輸出內容的腳本
/dev/tty
,因此預設情況下它不能輸出到日誌或任何內容中。我想從另一個腳本中擷取給定腳本的所有輸出,以將其儲存到一個變數中,包括 on/dev/tty
或由讀取命令生成的變數。文件:prompt_yes_no.sh (我不能碰)
#! /bin/bash source $SH_PATH_SRC/in_array.sh function prompt_yes_no() { # Correct answer to provide correct_answers=(y Y n N) local answer="" # While the answer has not been given while : do # Pop the question read -p "$1 " answer # Filter the answer if in_array "$answer" "${correct_answers[@]}"; then # Expected answer break fi # Failure to answer as expected if [ $# -gt 1 ]; then # Set message, /dev/tty prevents from being printed in logs echo "${2//$3/$answer}" > /dev/tty else # Default message echo "'$answer' is not a correct answer." > /dev/tty fi done # Yes, return true/0 if [ "$answer" == "y" ] || [ "$answer" == "Y" ]; then return 0 else # No, return false/1 return 1 fi }
文件:test-prompt_yes_no.sh:( 我正在做的)
#! /bin/bash # Helpers includes source $SH_PATH_HELPERS/test_results.sh # contains assert() # Sources source $SH_PATH_SRC/prompt_yes_no.sh ANSWER_OK="You agreed." ANSWER_DENIED="You declined." PATT_ANSWER="__ANSWER__" DEFAULT_DENIED_MSG="'$PATT_ANSWER' is not a correct answer." function prompt() { if prompt_yes_no "$@"; then echo "$ANSWER_OK" else echo "$ANSWER_DENIED" fi } function test_promptYesNo() { local expected="$1" result=`printf "$2" | prompt "${@:3}"` assert "$expected" "$result" } test_promptYesNo $'Question: do you agree [y/n]?\nYou agreed.' "y" "Question: do you agree [y/n]?" test_promptYesNo $'Question: do you agree [y/n]?\nYou declined.' "n" "Question: do you agree [y/n]?" test_promptYesNo $'Question: do you agree [y/n]?\n\'a\' is not a correct answer.\nYou declined.' "a\nn" "Question: do you agree [y/n]?"
測試將讀取從第一個腳本重定向到 /dev/tty 的所有輸出,擷取它們以便我進行比較。
我試圖
exec /dev/tty >&1
在第二個腳本的開頭將 tty 重定向到標準輸出,但出現“權限被拒絕”錯誤。
由於您知道其中的內容,
prompt_yes_no.sh
因此可以在包含它們之前對其進行編輯,/dev/tty
例如將其替換為 stdout。將您的來源替換為source <(sed 's|/dev/tty|/dev/stdout|g' <$SH_PATH_SRC/prompt_yes_no.sh)
或者對於較舊的 bash,使用臨時文件,例如
sed 's|/dev/tty|/dev/stdout|g' <$SH_PATH_SRC/prompt_yes_no.sh >/tmp/file source /tmp/file
您可以記錄程序在終端上顯示的所有內容
script
。該程序來自 BSD,可在大多數 Unix 平台上使用,有時與其他 BSD 工具一起打包,並且通常是最基本安裝的一部分。與導致程序輸出到正常文件的重定向不同,即使程序要求其輸出是終端,這也有效。