
Я пишу bash-скрипт и в нем делаю что-то вроде следующего:
#!/bin/sh
read -p "Enter target directory: " target_dir
cp some/file.txt $target_dir/exists/for/sure/
Когда я запускаю этот скрипт оболочки, я вижу и ввожу:
./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
или, что еще лучше, вообще не вводите переменные и т. п.