A parte que está claramente errada em seu script é que ele espera as linhas que seguem o
su - postgres
para ser executado como o usuário postgres. Isso não vai acontecer. No modo de lote,
su - postgres
inicia e sai imediatamente porque nenhum comando é alimentado a ele. Em seguida, os próximos comandos dos scripts são executados conforme o usuário inicia o script (presumivelmente root) e falham. Em vez disso, você deve escrever algo assim:
su - postgres <<-'EOF'
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
/usr/local/pgsql/bin/createdb test
EOF
# the lines after the EOF will be executed again as the initial user
As sugestões nos comentários pressupõem que você instalou o postgresql por meio de um pacote, mas esse não é o contexto da pergunta. Quando você instala a partir da fonte com
./configure
sem argumentos e make install
, ele nunca instalará nada fora de /usr/local/pgsql
. É perfeitamente normal não ter script de inicialização em /etc
nesse contexto.