Джастин разъяснил свой вопрос в своем первом комментарии к ответу Кванты. Он читает строку текста, используя read
(или каким-либо другим динамическим способом) и хочет расширить тильду.
Возникает вопрос: «Как выполнить расширение тильды для содержимого переменной?»
Общий подход заключается в использовании eval
, но он сопровождается некоторыми важными оговорками, а именно пробелами и выходным перенаправлением ( >
) в переменной. Кажется, мне подходит следующее:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
Попробуйте это с каждым из следующих входов:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
объяснение
${mypath//>}
Полоски из >
символов , которые могут затирать файл во время eval
.
- Это
eval echo ...
то, что фактическое расширение тильды
- Двойные кавычки вокруг
eval
для поддержки имен файлов с пробелами.
В дополнение к этому вы можете улучшить UX, добавив -e
опцию:
read -p "Provide the destination directory: " -e DESTINATION
Теперь, когда пользователь вводит тильду и нажимает на вкладку, она будет расширяться. Однако этот подход не заменяет вышеприведенный подход, поскольку расширение происходит только в том случае, если пользователь нажимает вкладку. Если он просто наберет ~ / foo и нажмет enter, он останется тильдой.
Смотрите также:
cd "~/Desktop"
вы также получаете ошибку. Он должен быть заключен в кавычки или сохранен как переменная (без кавычек). Например,a=~/Desktop; cd $a;
работает, но неa="~/Desktop"; cd Desktop;
смотри. Serverfault.com/questions/417252/…