相当简单,我的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
(我写的测试脚本所在的位置)。
那么交易是什么,我该如何让它发挥作用?
P.S。 bash --version
说我目前正在运行GNU bash,版本4.3.30(1) - 发布
答案 0 :(得分:2)
你需要双引号内的花括号来扩展bash
中的变量,比如,
echo "$(date) | blah blah" >> "${script_dir}/script.log"
'$'字符引入参数扩展,命令替换或算术扩展。
参数扩展的基本形式是$ {parameter} 。参数的值被替换。当参数是具有多个数字的位置参数时,或者当参数后跟不被解释为其名称一部分的字符时,需要括号。
${PARAMETER}
最简单的形式是在大括号内使用参数的名称。这与使用$FOO
完全相同,就像你在任何地方看到它一样,但其优点是可以立即跟随字符,否则将被解释为参数名称的一部分。比较这两个表达式(WORD =" car"例如),我们要打印一个带有尾随""的单词:
echo "The plural of $WORD is most likely $WORDs"
echo "The plural of $WORD is most likely ${WORD}s"
为什么第一个失败?它什么都不打印,因为一个名为" WORDs"的参数(变量)未定义,因此打印为"" (没有)。不使用大括号进行参数扩展,Bash将解释引入" $"中的所有有效字符的顺序。最后一个有效字符作为参数的名称。使用大括号时,您只需强制Bash只解释大括号内的名称。
答案 1 :(得分: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的变量的值。