2

Ранее я использовал pg_dump для создания резервной копии базы данных в моем домашнем каталоге с именем book_dump.sql.

Я хочу восстановить резервную копию в пустую базу данных с именем book.

Чтобы восстановить резервную копию, я попробовал эту команду:

psql book --file=~/book_dump.sql

Не удалось с этим сообщением:

~/book_dump.sql: No such file or directory

Я попробовал еще раз с абсолютным путем:

psql book --file=/home/user/book_dump.sql

На этот раз это сработало.

Я попытался использовать пробел после --file вместо равно:

psql book --file ~/book_dump.sql

Это работает также.

Почему не работает тильда, когда я использую знак равенства?

Это проблема, специфичная для psql, или это проблема Linux?

Могу ли я что-то изменить, чтобы заставить это работать, как я ожидаю?

1 ответ1

1

Это оболочка (не psql) отвечает за расширение символа ~ .

Предполагая bash, см. Http://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html:

Если слово начинается с символа кавычки без кавычек ('~'), все символы до первой косой черты без кавычек (или все символы, если без косой черты без кавычек) считаются префиксом тильды.

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

Каждое присвоение переменной проверяется на наличие префиксов тильды без кавычек, следующих сразу за ':' или первым '='. В этих случаях также выполняется расширение тильды. Следовательно, можно использовать имена файлов с тильдами в присваиваниях PATH, MAILPATH и CDPATH, а оболочка назначает расширенное значение.

--file=~/foo не является присваиванием переменной, поэтому расширение тильды не применяется. Я полагаю, вместо этого следует использовать --file=$HOME/foo .

С другой стороны, команда file=~/foo назначает /home/user/foo $file .

Также я вижу, что echo bar=~/foo будет выводить bar=/home/daniel/foo несмотря на то, что это не задание, в некоторых, по-видимому, есть некоторый коэффициент нечеткости в приведенном выше правиле.

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