La parte che è chiaramente sbagliata nel tuo script è che si aspetta le righe che seguono su - postgres da eseguire come utente postgres. Questo non accadrà.
In modalità batch, su - postgres si avvia ed esce immediatamente perché non gli viene inviato alcun comando. Quindi i comandi successivi degli script vengono eseguiti mentre l'utente avvia lo script (presumibilmente root) e falliscono.
Invece, dovresti scrivere qualcosa del genere:
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
I suggerimenti nei commenti presuppongono che tu abbia installato postgresql tramite un pacchetto, ma non è questo il contesto della domanda. Quando installi dal sorgente con ./configure senza argomenti e make install , non installerà mai nulla al di fuori di /usr/local/pgsql . È perfettamente normale non avere uno script di avvio in /etc in questo contesto.