"~/Desktop/test.txt: нет такого файла или каталога"

Я написал этот script:

#!/bin/bash

file="~/Desktop/test.txt"
echo "TESTING" > $file

script не работает; это дает мне эту ошибку:

./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory

Что я делаю неправильно?

Ответ 1

Попробуйте заменить ~ на $HOME. Расширение Тильды происходит только тогда, когда тильда не кавыдается. См. info "(bash) Tilde Expansion".

Вы также можете сделать file=~/Desktop без цитирования, но если вы когда-нибудь замените часть этого чем-нибудь разделителем поля в нем, тогда он сломается. Котировка значений переменных, вероятно, хорошая вещь, чтобы привыкнуть в любом случае. Цитирование переменной file=~/"Desktop" также будет работать, но я думаю, что это довольно уродливо.

Еще одна причина предпочесть $HOME, когда это возможно: расширение тильды происходит только в начале слов. Таким образом, command --option=~/foo будет работать, только если command делает сам расширение тильды, которое будет меняться по команде, а command --option="$HOME/foo" всегда будет работать.

Ответ 2

FYI, вы также можете использовать eval:

eval "echo "TESTING" > $file"

eval принимает команду как аргумент и вызывает оболочку для расширения Tilde.