template0
é criado ao instalar o PostgreSQL e não deve conter nenhuma modificação local; não deveria haver necessidade de fazer o backup. Modificações locais vão para template1
. (Veja link ).
Ele está falhando porque template0
não permite conexões (que é o padrão, para protegê-lo contra modificações locais acidentais):
postgres=# select datname, datallowconn from pg_database where datname = 'template0';
datname | datallowconn
-----------+--------------
template0 | f
(1 row)
PS: O PostgreSQL pode ser configurado para usar autenticação sem senha, o que evitará que você tenha que colocar uma senha em seu script. Pelo menos quando correr contra uma instância local.
PPS: Além disso, você pode salvar essa confusão do grep / awk com um select do pg_database:
$ psql postgres -Atc 'select datname from pg_database'
postgres
template0
⋮
template1
test