Temo che non ti piacerà questa risposta, ma al momento sembra impossibile. Dalla documentazione psql :
Salva i risultati delle query future nel nome file del file o convoglia i risultati futuri in una shell Unix separata per eseguire il comando. Se non viene specificato alcun argomento, l'output della query verrà reimpostato sull'output standard.
"Risultati della query" include tutte le tabelle, le risposte ai comandi e le notifiche ottenute dal server di database, nonché l'output di vari comandi di barra rovesciata che interrogano il database (come \ d), ma non i messaggi di errore.
E come hai notato, non è possibile reindirizzare i messaggi di errore quando si utilizza in modo psqlinterattivo.
(Ho giocato con tutti i tipi di reindirizzamento da \ o inutilmente. Sembra che il canale di output della query sia diverso da quello che riceve i messaggi di errore - e anche gli errori dal server e sollevati nelle tue procedure vanno in modi diversi .
test=# SHOW client_min_messages;
client_min_messages
---------------------
notice
-- added the above to show it's not a config problem
CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
RAISE NOTICE 'notice';
RETURN 1;
END;
$body$
LANGUAGE plpgsql;
test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE: notice
test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE: notice
contiene out.sql
raise_test
------------
1
(1 row)
in entrambi i casi. Questo è il motivo per cui non ho idea di quale canale / descrittore di file viene utilizzato per emettere i messaggi sollevati da una procedura.))
(C'è un thread sugli hacker PostgreSQL che potrebbe far luce su questo problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )
Quello che uno potrebbe eventualmente fare è iniziare psqlcome
psql test >/tmp/psql.out 2>&1
e questo reindirizzerà tutto l'output sul file specificato. L'unico problema è che non hai nemmeno un prompt e perdi le funzionalità di modifica della riga di comando.