我正在编写一个 bash 脚本,并在其中执行如下操作:
#!/bin/sh
read -p "Enter target directory: " target_dir
cp some/file.txt $target_dir/exists/for/sure/
当我运行这个 shell 脚本时,我看到并输入:
./my_script.sh
Enter target directory: ~/my_dir
但我得到错误/输出:
cp: directory ~/my_dir/exists/for/sure/ does not exist
而且,正如我试图表明的那样:该目录 100% 存在。即我可以运行以下命令而不会收到任何错误:
cd ~/my_dir/exists/for/sure/
这里发生了什么?
答案1
问题是,~
当您将其作为 的输入键入时,它是按字面意思理解的,并且不会扩展read
。
测试一下:
$ read target
~
$ ls $target
ls: cannot access '~': No such file or directory
(注意,周围的引号~
)
eval target=$target # unsafe
或更好,但只是扩展~
:
target="${target/#\~/$HOME}"
read
或者更好的是,首先不要输入变量或类似内容。