1

相当简单,我echo在我的 shell (bash) 脚本中有一个语句,我想重定向到一个外部文件作为日志记录的一种方式。该脚本由 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我编写的测试脚本所在的位置)。

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


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

4

2 回答 2

2

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

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

Shell Parameter Expansion

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

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


更多关于参数扩展

${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 仅解释大括号内的名称。

于 2017-01-22T13:55:34.020 回答
1

这一行有一个错误:

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

它应该是 :

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

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

于 2017-01-22T13:55:55.973 回答