zsh 写入路径存储在变量中的文件

zsh 写入路径存储在变量中的文件

我正在尝试将文本附加到文件中,其中文件名存储在变量中:

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

}

相关内容