Мы знаем, что ~
и $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
.
Таким образом, как правильно использовать cd
с ~
или $HOME
в таких сценариях bash?
Можно решить эту проблему при помощи оценка команда:
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"
, поскольку в Вашем коде $dir1
не сохранит ~/Desktop
, но он сохранит /home/user/Desktop
, таким образом, можно будет использовать команду оценки.
Для понимания команда Eval Здесь
Вот пример, который работает.
, Как сказано прежде, расширение переменных от входа является ключом.
#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd
, Конечно, Вы не должны ожидать, что Ваша текущая оболочка изменит свой рабочий каталог после выполнения сценария. Это останется незатронутым.
Проблемой является расширение тильды, происходит перед переменным расширением (см. man bash
для деталей). Переменное расширение происходит только однажды, таким образом $dir1
расширен, но строка $HOME
внутренняя часть это не.
могло бы быть легче определить путь к каталогу как параметр командной строки вместо того, чтобы использовать read
для чтения его из консоли: оболочка развернет его для Вас:
#!/bin/bash
dir1=$1
cd "$dir1"
pwd
и вызов это как
./script ~/Desktop
Другая альтернатива должна использовать диалоговое окно файла вместо того, чтобы ввести путь вообще:
dialog --dselect / 20 20