1

Я всегда использовал пути, которые не прописаны жестко в кавычках для моих скриптов bash. Таким образом, если путь (введенный пользователем, домашний каталог пользователя и т.д.) Содержит странные символы, пробелы или тире, мой сценарий не будет мешать и двигаться как обычно.

Но я только что заметил, что, хотя он работает с большинством путей, он потерпит неудачу с путями, которые имеют тильду в качестве ярлыка для домашнего каталога пользователя. например:

# works
install dotfile "/home/user/.dotfile"

# fails
install dotfile "~/.dotfile"
# fails
cp dotfile "~/.dotfile"

Цитаты пытаются защитить от синтаксического анализа самого ~ . как он пытается скопировать файл в ./~/.dotfile

Я хочу использовать ~/ потому что это удобно (и просто. И просто означает меньше ошибок), и заключить его в кавычки, потому что это безопасно от пробелов и тире. Есть ли способ иметь оба?

2 ответа2

2

Попробуйте использовать eval следующим образом, чтобы развернуть ~/ до фактического полного пути к файлу:

my_path=".dotfile"
eval full_path=$(printf "~/%q" "$my_path")
echo $full_path

Или попробуйте это:

eval full_path=$(echo "~/.dotfile")
echo $full_path
2

Я хочу использовать ~/, потому что это удобно (и просто. И просто означает меньше ошибок), и заключить его в кавычки, потому что это безопасно от пробелов и тире. Есть ли способ иметь оба?

Да, хорошей практикой является использование двойных кавычек. Только не кладите их вокруг ~/ . Оставьте эту часть без кавычек:

install dotfile ~/".dotfile"

Расширения тильды и сложные имена в домашних каталогах

Расширение ~ использует переменную HOME . Давайте создадим каталог со сложным именем и присвоим его HOME и посмотрим, как ведет себя оболочка:

$ mkdir $'/tmp/spaces and\ttabs'
$ HOME=$'/tmp/spaces and\ttabs'
$ cd ~/
$ pwd
/tmp/spaces and tabs

Таким образом, это сработало правильно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .