tty를 표준으로 리디렉션

tty를 표준으로 리디렉션

에 무언가를 출력하는 스크립트가 있으므로 /dev/tty기본적으로 로그 등으로 출력할 수 없습니다. 다른 스크립트에서 주어진 스크립트의 모든 출력을 캡처하여 /dev/ttyread 명령에 의해 생성된 출력 또는 출력을 포함하여 변수에 저장하고 싶습니다 .

파일: 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를 stdout으로 리디렉션하려고 시도했지만 "권한 거부" 오류가 발생했습니다.

답변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

관련 정보