に何かを出力するスクリプトがあるため、デフォルトでは/dev/tty
ログなどで出力できません。他のスクリプトから与えられたスクリプトのすべての出力をキャプチャして、/dev/tty
readコマンドによって生成された出力または出力を含む変数に保存したいと思います。
ファイル: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
2番目のスクリプトの先頭でttyをstdoutにリダイレクトしようとしましたが、「許可拒否」エラーが発生しました。
ベストアンサー1
プログラムが端末に表示するすべてを記録できます。script
。このプログラムはBSDで提供されており、ほとんどのUnixプラットフォームで利用でき、時には他のBSDツールと一緒にパッケージ化され、通常は最も基本的なインストールの一部です。プログラム出力を通常のファイルにするリダイレクトとは異なり、これはプログラム出力を端末にする必要がある場合にも機能します。