bash输入/输出到日志文件

时间:2017-10-25 17:51:46

标签: linux bash logging

我有一个带有以下语句的bash脚本。我需要在日志文件中输出“你快乐吗?答案”是“否”或“否”的问题。我能够通过“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 这个问题是我有几个长语句提示,我喜欢让我的脚本保持简洁

1 个答案:

答案 0 :(得分:1)

重定向仅适用于echo。您需要在done之后添加类似的重定向。 (这也会重定向您echocase的错误消息,偶然应该出现标准错误):

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会这样做,但它可能不适合交互式脚本(因为您不能在输出中包含标准的输入)。

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