Por que o sudo ignora seu caminho
sudo não usa o caminho do usuário ou o caminho do usuário do postgres. O sudo tem seu próprio caminho, definido pela variável secure_path no arquivo /etc/sudoers .
A saída de echo $PATH é enganosa neste caso. Para ver o caminho que o sudo realmente usa, use printenv PATH . No meu caso, a saída ficou assim:
$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin
A saída não contém /usr/pgsql-9.2/bin , onde o psql mora, portanto não está no caminho do sudo.
Para corrigir o problema, você pode adicionar onde o psql vive para a variável secure_path .
Como dizer ao sudo onde o psql mora
Use sudo visudo para abrir /etc/sudoers no vi.
O arquivo deve conter uma linha como esta:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Esta linha define o caminho para o sudo. A parte depois do sinal de igual é igual à saída do exemplo anterior de printenv PATH .
Substitua por algo assim:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin
A substituição anexa /usr/pgsql-9.2/bin à lista de caminhos. O separador da lista de caminhos é dois pontos ( : ).
Salve e feche o arquivo.
Para verificar se funcionou, tente novamente o comando printenv PATH :
$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin
Parece bom!
Agora tente o comando psql -l :
$ sudo -u postgres psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
postgis_test | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
Funciona!
Obrigado ao Drew Khoury que me indicou um solução para um problema semelhante em Super User .