我有一个带有以下语句的 bash 脚本。我需要将问题“你快乐吗?”和"is"或“否”的答案输出到日志文件。我可以使用“echo”$yn“>>log1.log 获得日志文件的答案2>&1"但不是问题(读取命令)
while true; do
read -p "Are you happy? " yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done
echo "$yn" >>log1.log 2>&1
我尝试过的: 阅读-p“你还好吗?” yn > log.log 2>&1 这确实有效,但是当我运行我的脚本时,问题没有显示。 我发现的唯一方法是回显“你开心吗?$yn” >>log1.log 2>&1 这个问题是我有几个长语句的提示,我喜欢让我的脚本简洁明了
最佳答案
重定向仅适用于 echo
。您需要在 done
之后添加一个类似的重定向。 (这也将重定向您从 case
中 echo
的错误消息,顺便说一句应该转到标准错误):
while true; do
read -p "Are you happy? " yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no." >&2;;
esac
done >>log1.log 2>&1
echo "$yn" >>log1.log
或者将整个命令序列放在圆括号或大括号内。
{ while true; do
read -p "Are you happy? " yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no." >&2;;
esac
done
echo "$yn"; } >>log1.log 2>&1
就像您发现的那样,正如该术语应该揭示的那样,重定向会导致输出到另一个地方(在本例中是一个文件而不是您的终端)。如果您希望它也显示在终端上,tee
可以做到这一点,但它可能不适合交互式脚本(因为您不能在输出中包含标准 input) .
tripleee$ cat >nst
#!/bin/bash
while true; do
read -p "Are you happy? " yn
case $yn in
[Yy]*) break;;
[Nn]*) exit;;
*) echo "Please answer yes or no." >&2;;
esac
done
echo "$yn"
^D
tripleee$ chmod +x ./nst
tripleee$ ./nst 2>&1 | tee log1.log
Are you happy? forget it
Please answer yes or no.
Are you happy? no
tripleee$ cat log1.log
Are you happy? Please answer yes or no.
Are you happy? tripleee$
也许您实际上是在寻找 script
命令?
tripleee$ script typescript ./nst
Script started, output file is typescript
Are you happy? forget it
Please answer yes or no.
Are you happy? yes ma'am
yes ma'am
Script done, output file is typescript
tripleee$ nl -ba typescript
1 Script started on Thu Oct 26 20:34:04 2017
2 command: ./nst
3 Are you happy? forget it
4 Please answer yes or no.
5 Are you happy? yes ma'am
6 yes ma'am
7
8 Script done on Thu Oct 26 20:34:11 2017
请注意,typescript
文件将包含用户所做的任何编辑,即拼写错误及其更正,以及终端用于执行编辑的各种显示代码。
关于linux - bash 输入/输出到日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46939003/