【问题标题】:bash input/ouput to a log filebash 输入/输出到日志文件
【发布时间】:2017-10-25 17:51:45
【问题描述】:

我有一个带有以下语句的 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 这样做的问题是我有几个带有长语句的提示,我喜欢让我的脚本保持简洁

【问题讨论】:

  • 类似read -p '...' yn 2>&1 | tee logfile?
  • @randomir nope,无法识别我的输入。我运行脚本,点击“是”,然后它问我“请回答是或否。”
  • 你添加| tee ..了吗?
  • 是的。 yn 2>&1 | tee log.log
  • 或许echo "Are you happy? ${yn}" >> log1.log?

标签: linux bash logging


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

【讨论】:

  • 感谢您的回答,是的,我也在寻找要在终端上显示的问题。当我使用 tee 时,它​​无法识别我的“是”或“否”答案。一直说“请回答是或否”。我尝试使用脚本,但它到处都是,也许我没有正确使用它
  • 我发现的唯一方法是回显 "Are you happy? $yn" >>log1.log 2>&1 这个问题是我有几个带有长语句的提示,我喜欢保留我的脚本又好又短
  • 添加了script的示例。
  • 重定向可以在外部范围内完成,因此您的个人 read 提示不需要对每个提示进行显式重定向,就像我在第一个示例中展示的那样。
猜你喜欢
  • 2014-10-04
  • 2010-11-03
  • 2014-12-24
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2016-02-21
相关资源
最近更新 更多