将 tty 重定向到标准

将 tty 重定向到标准

我有一个在 上输出内容的脚本/dev/tty,因此默认情况下它无法输出到日志或任何内容中。我想从另一个脚本捕获给定脚本的所有输出,以将其存储到一个变量,包括 上的输出/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 重定向到标准输出,但出现“权限被拒绝”错误。

答案1

您可以记录程序在终端上显示的所有内容script。该程序来自 BSD,可在大多数 Unix 平台上使用,有时与其他 BSD 工具一起打包,并且通常是最基本安装的一部分。与导致程序输出到常规文件的重定向不同,即使程序要求其输出是终端,这也可以工作。

答案2

由于您知道 的内容,因此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

相关内容