为什么无法将输出重定向到以波形符 (~) 开头的文件路径?

为什么无法将输出重定向到以波形符 (~) 开头的文件路径?

我是 bash 的长期用户,但遇到了我以前从未见过的东西(或者根本不记得)。当我尝试将输出重定向到日志文件时,出现“没有这样的文件或目录”错误,我已经这样做了数千次,但显然不是以这种方式。以下是重现问题的示例输出:

测试.sh:

#!/bin/bash
logfile="~/logs/$(date +%Y%m%d_%H%M%S).log"
echo "Test" > ${logfile}

输出:

$ ./test.sh
./test.sh: line 3: ~/logs/20220114_025115.log: No such file or directory

我最终将问题隔离到 ~ 上,解决我的问题的方法是使用 $HOME 或硬编码完整路径(嘘!),但我的问题是为什么 ~ 运算符没有扩展为我的主目录?我用谷歌搜索答案,但没有一个与我的问题完全匹配。提前致谢。

答案1

仅当波浪号字符未加引号时才会发生波浪号扩展。来自 bash 手册:

如果单词以不带引号的波浪号字符 ('~') 开头,则直到第一个不带引号的斜杠之前的所有字符(或所有字符,如果没有不带引号的斜杠)都将被视为波浪号前缀。

https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html

您可以通过将引号移动到第一个斜杠字符之后的位置来强制扩展。即从"~/logs/$(date +%Y%m%d_%H%M%S).log"~/"logs/$(date +%Y%m%d_%H%M%S).log"

相关内容