Por que 'psql --file' interpreta erroneamente o til?

2

Antes eu usei o pg_dump para criar um backup de banco de dados no meu diretório home chamado book_dump.sql.

Eu quero restaurar o backup para um banco de dados vazio chamado livro.

Para restaurar o backup, tentei este comando:

psql book --file=~/book_dump.sql

Falhou com esta mensagem:

~/book_dump.sql: No such file or directory

Eu tentei novamente com um caminho absoluto:

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

Desta vez funcionou.

Eu tentei usar um espaço depois de --file em vez de igualar:

psql book --file ~/book_dump.sql

Isso também funciona.

Por que o til não funciona quando eu uso o sinal de igual?

Este é um problema específico do psql, ou é um problema do Linux?

Posso alterar algo para que funcione como esperado?

    
por Iain Samuel McLean Elder 22.11.2013 / 04:06

1 resposta

1

É o shell (não o psql) que é responsável por expandir o caractere ~ .

Assumindo o bash, consulte o link :

If a word begins with an unquoted tilde character (‘~’), all of the characters up to the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix

O til precedido por um sinal de igual é, de certa forma, um caso especial. Eles dizem:

Each variable assignment is checked for unquoted tilde-prefixes immediately following a ‘:’ or the first ‘=’. In these cases, tilde expansion is also performed. Consequently, one may use file names with tildes in assignments to PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

--file=~/foo não é uma atribuição variável, portanto, a expansão do til não é aplicada. Eu acho que --file=$HOME/foo deve ser usado no lugar.

Por outro lado, file=~/foo como um comando atribui /home/user/foo a $file .

Além disso, vejo que echo bar=~/foo produzirá bar=/home/daniel/foo apesar de não ser uma atribuição, alguns aparentemente há algum fator fuzz na regra acima.

    
por 06.12.2013 / 17:46