linux - bash 输入/输出到日志文件

标签 linux bash logging

我有一个带有以下语句的 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 之后添加一个类似的重定向。 (这也将重定向您从 caseecho 的错误消息,顺便说一句应该转到标准错误):

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/

相关文章:

java - 在 Java 中解析以下日志条目的最佳方法是什么?

xml - 在 Log4Net XML 配置中,优先级是否与级别相同?

php - 如何在 Alpine 3.6 上安装 PHP soap 扩展

linux - 如何永久设置boot2docker的环境变量

Linux 内核/proc FIFO/管道

linux - sleep 过程直到在 Go 中完成

c - getpid(), WIFSHSTOPPED(state) 检查子进程是否处于 sleep 状态

linux - AWK编程,条件语句

linux - 如何检索当前分钟并检查该分钟是否在文件中

django - 登录 Django/Celery 的 Sentry 停止工作