Linux bash输入/输出到日志文件

Linux bash输入/输出到日志文件,linux,bash,logging,Linux,Bash,Logging,我有一个带有下面语句的bash脚本。我需要将问题“你高兴吗?”和答案“是”或“否”都输出到日志文件中。我可以使用“echo”$yn”>>log1.log 2>&1”获取日志文件的答案,但不能获取问题(read命令) 我所尝试的: 阅读-p“你还好吗?”yn>log.log 2>&1 这确实会起作用,但是当我运行我的纸条时,问题不会显示出来。 我唯一能找到的方法就是回应“你快乐吗?”$yn“>>log1.log 2>&1 问题是,我有几个长语句的提示,我喜欢保持我的脚本简洁重定向只适用于echo。

我有一个带有下面语句的bash脚本。我需要将问题“你高兴吗?”和答案“是”或“否”都输出到日志文件中。我可以使用“echo”$yn”>>log1.log 2>&1”获取日志文件的答案,但不能获取问题(read命令)

我所尝试的: 阅读-p“你还好吗?”yn>log.log 2>&1 这确实会起作用,但是当我运行我的纸条时,问题不会显示出来。
我唯一能找到的方法就是回应“你快乐吗?”$yn“>>log1.log 2>&1
问题是,我有几个长语句的提示,我喜欢保持我的脚本简洁

重定向只适用于
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
echo "$yn"; } >>log1.log 2>&1
正如您发现的,正如术语应该揭示的那样,重定向会导致输出转到另一个位置(在本例中,是一个文件而不是您的终端)。如果您希望它也显示在终端上,那么,
tee
会这样做,但它可能不适用于交互式脚本(因为不能在输出中包含标准输入)

也许您实际上正在寻找
脚本
命令

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
文件将包含用户所做的任何编辑,即输入错误及其更正,以及终端用于执行编辑的各种显示代码。

类似的内容
read-p'…'yn 2>&1 | tee logfile
?@randomir nope,无法识别我的输入。我运行脚本,点击“是”然后它会问我“请回答是或否”。您是否添加了
|tee..
?是的。yn 2>&1 | tee log.log可能
echo“您高兴吗?${yn}”>>log1.log
?谢谢您的回答,是的,我正在寻找显示在终端上的问题。当我使用tee时,它无法识别我的“是”或“否”回答。不停地说“请回答是或否”。我试图使用脚本,但它到处都是,也许我没有正确地使用它。我发现的唯一方法是回应“你快乐吗?$yn”>>log1.log 2>&1这方面的问题是,我有几个长语句的提示,我喜欢保持我的脚本简洁,并添加了一个带有
script
的示例。重定向可以在外部范围内完成,因此您的单个
读取
提示不需要对每个提示进行显式重定向,就像我在第一个示例中显示的那样。
{ 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
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$
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