![zsh 写入路径存储在变量中的文件](https://linux22.com/image/191487/zsh%20%E5%86%99%E5%85%A5%E8%B7%AF%E5%BE%84%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我正在尝试将文本附加到文件中,其中文件名存储在变量中:
x="/path/to/file.txt"
echo "some text here" >> "${=x}"
但它不起作用——据我所知,没有任何反应,并且该行不会写入文件。当我现在正在测试它时,我将脚本的其他行中的文本直接回显到文件(不通过变量)。所有这些都有效——我的文件只是缺少我正在测试变量的一行。为了清楚起见,我在下面包含了实际的代码。
如果我回显它,$x 会正确扩展,并且可以手动将“${=x}”替换为文件名。我究竟做错了什么?
谢谢你!
详细信息:zsh 5.8
MacOS Big Sur
实际代码(公司名称已混淆):
# Define log file location.
# Log file can be updated later for portability. But for now, I want to keep it in a personal directory.
#
readonly LOG_FILE="/Users/jim.turner.m1/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log"
# Prep log file
#
prep_log()
{
# echo "==============================================================" >> "${=LOG_FILE}"
echo "Sanitize.sh started $(date)." >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
echo "Sanitizing $(pwd)." >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
echo "==============================================================" >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
echo >> ~/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
}
结果是:
Sanitize.sh started Fri May 21 09:21:27 EDT 2021.
Sanitizing /Users/jim.turner.m1/Desktop/untitled folder.
==============================================================
答案1
问题在于您将变量设置为包含转义空格的字符串。你正在做的var='foo\ bar'
这意味着字符串被保存和这\
。但是,您随后使用了引用的变量(好),但这意味着它正在寻找名为 的文件foo\ bar
而不是名为 的文件foo bar
。设置变量时,任何一个引用字符串或者转义空格,但不要同时执行这两种操作:
readonly log_file=/Users/jim.turner.m1/OneDrive\ -\ obfuscated/Shell\ Scripts/sanitize.log
或者
readonly log_file="/Users/jim.turner.m1/OneDrive - obfuscated/Shell Scripts/sanitize.log"
其中任何一个都应该有效。另请注意我如何将变量更改为使用小写字母,因为对 shell 变量使用大写字母是不好的做法,因为这是环境变量的约定,有时会导致变量名称冲突。最后,非常小的一点,你不需要$(pwd)
,你可以只使用PWD
变量,你可能想使用特雷多克保持物品整洁干净。将所有这些与其他一些改进结合在一起可以得到:
# Define log file location.
# Log file can be updated later for portability. But for now, I want to keep it in a personal directory.
#
readonly log_file="/Users/jim.turner.m1/OneDrive - obfuscated/Shell Scripts/sanitize.log"
# Prep log file
#
prep_log()
{
cat << EoF > "$log_file"
==============================================================
Sanitize.sh started $(date).
Sanitizing $PWD
==============================================================
EoF
}