Bash

將 tty 重定向到標準

  • July 20, 2016

我有一個在 上輸出內容的腳本/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 工具一起打包,並且通常是最基本安裝的一部分。與導致程序輸出到正常文件的重定向不同,即使程序要求其輸出是終端,這也有效。

引用自:https://unix.stackexchange.com/questions/297112