【问题标题】:How do I redirect output of echo command in bash script to script's directory?如何将 bash 脚本中的 echo 命令的输出重定向到脚本的目录?
【发布时间】:2017-01-22 13:51:58
【问题描述】:

相当简单,我的 shell (bash) 脚本中有一个 echo 语句,我想重定向到一个外部文件作为日志记录的一种方式。该脚本由 root 用户的 crontab 每小时运行一次(通过sudo crontab -e)。

我希望此日志文件与脚本位于同一目录中。

我的第一次尝试是,

echo "$(date) | blah blah" >> "$(pwd)/script.log"

但是,这显然不起作用,因为根 crontab (/root/) 的工作目录与脚本的目录不同。所以我遵循了一些关于 SO 的建议,

script_dir=$(dirname $0)
echo "$(date) | blah blah" >> "$(script_dir)/script.log"

这次,由于我还不明白的原因,日志文件保存在/下,如/script.log

从逻辑上讲,人们会假设变量 script_dir 被评估为空字符串,因此 "$(script_dir)/script.log" 被评估为 "/script.log"

但是作为测试,我写了一个简单的测试脚本,

echo "$(dirname $0)"

并从/ 运行它。果然,我得到了一个正确的非空输出:/home/pi/scripts/testscripts/dirname.sh(我编写的测试脚本所在的位置)。

那么交易是什么,我该如何让它发挥作用?


附言bash --version 说我目前正在运行 GNU bash,版本 4.3.30(1)-release

【问题讨论】:

  • 顺便说一句,你这样做echo "$(date) | blah blah"的意图是什么,这对我来说毫无意义。
  • @Inian 我的脚本在失去互联网连接时使用shutdown -r now 重新启动我的树莓派,我通过查看if 条件中的ping 命令的退出代码来确定。我想要记录何时发生这种情况。完整的echo 语句实际上是"$(date +"%d %b %r") | $(uptime -p) | Exit ${code}. Restarting..."
  • 很公平!干杯!

标签: bash output dirname


【解决方案1】:

您需要双引号中的大括号来扩展bash 中的变量,例如,

echo "$(date) | blah blah" >> "${script_dir}/script.log"

Shell Parameter Expansion

“$”字符引入参数扩展、命令替换或算术扩展。

参数展开的基本形式是${parameter}。参数的值被替换。当参数是一个多于一位的位置参数时,或者当参数后跟一个不被解释为其名称的一部分的字符时,大括号是必需的。


More on Parameter expansion

${PARAMETER}

最简单的形式是在大括号内使用参数名称。这与使用$FOO 相同,就像您在任何地方看到的那样,但它的优点是它可以紧跟在其他情况下将被解释为参数名称的一部分的字符。比较这两个表达式(例如 WORD="car"),我们要打印一个带有尾随“s”的单词:

echo "The plural of $WORD is most likely $WORDs"
echo "The plural of $WORD is most likely ${WORD}s"

为什么第一个失败了?它不打印任何内容,因为名为“WORDs”的参数(变量)未定义,因此打印为“”(无)。在不使用大括号进行参数扩展的情况下,Bash 将从引入的“$”到最后一个有效字符的所有有效字符的序列解释为参数的名称。使用大括号时,您只需强制 Bash 仅解释大括号内的名称。

【讨论】:

    【解决方案2】:

    这一行有错误:

    echo "$(date) | blah blah" >> "$(script_dir)/script.log"
    

    应该是:

    echo "$(date) | blah blah" >> "$script_dir/script.log"
    

    "$(script_dir)" 语法尝试执行名为script_dir 的命令并捕获其输出以用作字符串中的值。您需要的是一个简单的变量扩展,$script_dir,它只是提取名为 script_dir 的变量的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2021-12-10
      • 2020-03-22
      • 1970-01-01
      • 2012-07-05
      • 2023-03-30
      相关资源
      最近更新 更多