Redirecionar tty para padrão

2

Eu tenho um script que gera resultados em /dev/tty , portanto, ele não pode ser enviado para logs ou qualquer coisa por padrão. Gostaria de capturar TODAS as saídas do script fornecido de outro script para armazená-lo em uma variável, incluindo aquelas em /dev/tty ou aquelas feitas a partir de comandos de leitura.

Arquivo: prompt_yes_no.sh (que não consigo tocar)

#! /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
}

Arquivo: test-prompt_yes_no.sh: (o que estou fazendo)

#! /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]?"

O teste leria todas as saídas redirecionadas para / dev / tty do primeiro script, capturando-as para que eu pudesse comparar.

Eu tentei exec /dev/tty >&1 no início do segundo script para redirecionar o tty para a saída padrão, mas recebi o erro 'Permissão negada'.

    
por Sylordis 20.07.2016 / 15:25

2 respostas

2

Como você sabe o conteúdo de prompt_yes_no.sh , pode editá-los antes de incluí-los, substituindo o /dev/tty por, por exemplo, stdout. Substitua sua fonte por

source <(sed 's|/dev/tty|/dev/stdout|g' <$SH_PATH_SRC/prompt_yes_no.sh)

ou para o bash mais antigo, use um arquivo temporário, por exemplo

sed 's|/dev/tty|/dev/stdout|g' <$SH_PATH_SRC/prompt_yes_no.sh >/tmp/file
source /tmp/file
    
por 20.07.2016 / 16:42
2

Você pode gravar tudo que um programa exibe em um terminal com script . Este programa vem do BSD e está disponível na maioria das plataformas Unix, às vezes empacotado com outras ferramentas BSD, e muitas vezes parte da instalação mais básica. Ao contrário do redirecionamento, que faz com que o programa seja enviado para um arquivo regular, isso funciona mesmo se o programa exigir que sua saída seja um terminal.

    
por 21.07.2016 / 01:01