在 bash 脚本中使用带有“~”或“$HOME”的 cd 命令时出现问题

在 bash 脚本中使用带有“~”或“$HOME”的 cd 命令时出现问题

我们知道,~$HOME参考当前用户的主目录。(对我来说echo ~= echo $HOME= pandya)。

但我不能在 Bash 脚本中使用它。这是一个简单的示例脚本:

#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
cd $dir1

但执行时会出现错误No such file or directory如下:

$ ./script
Enter Directory Path:~/Desktop
./script: line 4: cd: ~/Desktop: No such file or directory

如果/home/pandya用来代替~,那么它就是有效的。

同样的问题$HOME

那么,如何在这样的 bash 脚本中正确使用cdwith~或?$HOME

答案1

您可以使用以下方法解决此问题评估命令 :

#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"

因为您的代码中$dir1不会存储~/Desktop但它会存储/home/user/Desktop所以您可以使用 eval 命令。

理解评估命令这里

答案2

这是一个有效的例子。

正如前面所说,从输入扩展变量是关键。

#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd

当然,您不应该期望当前 shell 会在脚本执行后改变其工作目录。它将不受影响。

答案3

问题是波浪号扩展发生在变量扩展之前(man bash详情请参阅)。变量扩展只发生一次,因此$dir1被扩展,但其中的字符串$HOME没有被扩展。

将目录路径指定为命令行参数可能比read从控制台读取更容易:shell 将为您扩展它:

#!/bin/bash
dir1=$1
cd "$dir1"
pwd

并称之为

./script ~/Desktop

另一种方法是使用文件对话框,而根本不输入路径:

dialog --dselect / 20 20

答案4

使用 eval 存在安全问题。
只需用变量 HOME 代替波浪号即可。

# Expand Tilde.
d="~/somedir";
d="${d/#\~/${HOME}}";

相关内容