如何将bash脚本中echo命令的输出重定向到脚本的目录?

时间:2017-01-22 13:51:58

标签: bash output dirname

相当简单,我的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) - 发布

2 个答案:

答案 0 :(得分:2)

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

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

Shell Parameter Expansion

     

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

     

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

More on Parameter expansion

${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的变量的值。