为什么我不能通过 chmod 命令使用环境变量?

为什么我不能通过 chmod 命令使用环境变量?

我无法通过 chmod 命令使用环境变量。有什么解决方法可以运行这个吗?

我尝试在 sh 文件中运行的方式

export PEM_FILE="~/.ssh/xxx.pem"
chmod 400 $PEM_FILE

## Output
chmod: ~/.ssh/xxx.pem: No such file or directory

然而,如果没有像这样的变量,它工作得很好:chmod 400 ~/.ssh/xxx.pem

PS:我用的是macOS。请告诉我这在 Windows 或 Linux 中是否可以正常工作。

谢谢!

答案1

不幸的是,像这样的特殊字符~在字符串中不起作用。相反,使用变量(如$HOME指向主目录)或删除引号。 (不推荐,因为它破坏了与某些 shell 的兼容性)

所以你会这样做:export PEM_FILE=“$HOME/.ssh/xxx.pem”或export PEM_FILE=~/.ssh/xxx.pem。

答案2

问题是 ~ 是通配符,bash 通常会在执行命令之前扩展所有通配符并执行变量扩展。但就你而言,你正在使用配额,这会阻止 bash 进行通配符解析,所以

导出 PEM_FILE="~/.ssh/xxx.pem"

PEM_FILE 将不包含文件的路径,而是包含字符串。 chmod 命令将接收该字符串作为参数,再次不执行解析通配符。

所以只需删除配额即可

export PEM_FILE=~/.ssh/xxx.pem

或使用完整路径

export PEM_FILE="/home/username/.ssh/xxx.pem"

两者都会起作用。

相关内容