Джастін уточнив своє питання в своєму першому коментарі щодо відповіді квантів. Він читає рядки тексту за допомогою read
(або якимись іншими динамічними засобами) і хоче розгорнути тильду.
Питання стає "Як виконати розширення tilde на вмісті змінної?"
Загальний підхід полягає у використанні 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
Тепер, коли користувач набере вкладку "tilde" та "hits", вона розшириться. Цей підхід не замінює підхід eval вище, однак, оскільки розширення відбувається лише в тому випадку, якщо користувач натискає вкладку. Якщо він просто набере ~ / foo і натисне вхід, він залишиться як тильда.
Дивись також:
cd "~/Desktop"
ви також отримуєте помилку. Він повинен бути без котирування або збережений у вигляді змінної (без лапок). Наприклад,a=~/Desktop; cd $a;
працює, але неa="~/Desktop"; cd Desktop;
дивіться serverfault.com/questions/417252/…