如何将 bash 脚本中 echo 命令的输出重定向到脚本目录?
How do I redirect output of echo command in bash script to script's directory?
非常简单,我的 shell (bash) 脚本中有一个 echo
语句,我想将其重定向到外部文件作为日志记录的一种方式。该脚本每小时由 root 用户的 crontab 运行(通过 sudo crontab -e
)。
我希望此日志文件与脚本位于同一目录中。
我的第一次尝试是,
echo "$(date) | blah blah" >> "$(pwd)/script.log"
然而,这显然不起作用,因为根 crontab (/root/
) 的工作目录与脚本目录不同。所以我遵循了一些关于 SO 的建议,
script_dir=$(dirname [=12=])
echo "$(date) | blah blah" >> "$(script_dir)/script.log"
这一次,由于我还不明白的原因,日志文件保存在 /
下,如 /script.log
.
从逻辑上讲,人们会假设变量 script_dir
被评估为空字符串,因此 "$(script_dir)/script.log"
被评估为 "/script.log"
。
但是作为测试,我写了一个简单的测试脚本,
echo "$(dirname [=13=])"
和 运行 它来自 /
。果然,我得到了一个正确的非空输出:/home/pi/scripts/testscripts/dirname.sh
(我写的测试脚本所在的地方)。
这是怎么回事,我该如何让它发挥作用?
p.s。 bash --version
说我目前 运行ning GNU bash,版本 4.3.30(1)-release
您需要 double-quotes 中的花括号来扩展 bash
中的变量,例如
echo "$(date) | blah blah" >> "${script_dir}/script.log"
The ‘$’ character introduces parameter expansion, command substitution, or arithmetic expansion.
The basic form of parameter expansion is ${parameter}. The value of parameter is substituted. The braces are required when parameter is a positional parameter with more than one digit, or when parameter is followed by a character that is not to be interpreted as part of its name.
${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 仅解释大括号内的名称即可。
这一行有错误:
echo "$(date) | blah blah" >> "$(script_dir)/script.log"
应该是:
echo "$(date) | blah blah" >> "$script_dir/script.log"
"$(script_dir)"
语法尝试执行名为 script_dir
的命令并捕获其输出以用作字符串中的值。您需要的是一个简单的变量扩展,$script_dir
,它只是提取名为 script_dir.
的变量的值
非常简单,我的 shell (bash) 脚本中有一个 echo
语句,我想将其重定向到外部文件作为日志记录的一种方式。该脚本每小时由 root 用户的 crontab 运行(通过 sudo crontab -e
)。
我希望此日志文件与脚本位于同一目录中。
我的第一次尝试是,
echo "$(date) | blah blah" >> "$(pwd)/script.log"
然而,这显然不起作用,因为根 crontab (/root/
) 的工作目录与脚本目录不同。所以我遵循了一些关于 SO 的建议,
script_dir=$(dirname [=12=])
echo "$(date) | blah blah" >> "$(script_dir)/script.log"
这一次,由于我还不明白的原因,日志文件保存在 /
下,如 /script.log
.
从逻辑上讲,人们会假设变量 script_dir
被评估为空字符串,因此 "$(script_dir)/script.log"
被评估为 "/script.log"
。
但是作为测试,我写了一个简单的测试脚本,
echo "$(dirname [=13=])"
和 运行 它来自 /
。果然,我得到了一个正确的非空输出:/home/pi/scripts/testscripts/dirname.sh
(我写的测试脚本所在的地方)。
这是怎么回事,我该如何让它发挥作用?
p.s。 bash --version
说我目前 运行ning GNU bash,版本 4.3.30(1)-release
您需要 double-quotes 中的花括号来扩展 bash
中的变量,例如
echo "$(date) | blah blah" >> "${script_dir}/script.log"
The ‘$’ character introduces parameter expansion, command substitution, or arithmetic expansion.
The basic form of parameter expansion is ${parameter}. The value of parameter is substituted. The braces are required when parameter is a positional parameter with more than one digit, or when parameter is followed by a character that is not to be interpreted as part of its name.
${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 仅解释大括号内的名称即可。
这一行有错误:
echo "$(date) | blah blah" >> "$(script_dir)/script.log"
应该是:
echo "$(date) | blah blah" >> "$script_dir/script.log"
"$(script_dir)"
语法尝试执行名为 script_dir
的命令并捕获其输出以用作字符串中的值。您需要的是一个简单的变量扩展,$script_dir
,它只是提取名为 script_dir.