Sto cercando di capire lo script di seguito e sono confuso sulla linea su. Comprendo gli argomenti della riga di comando di Postgres.
quando faccio man su
il manuale dice
-c, –command=COMMAND
passa un singolo COMANDO alla shell con -c
Comunque la riga con su - postgres -c ...
sembra contenere due comandi
- il primo imposta la variabile d'ambiente LD_LIBRARY
- il secondo chiama pg_ctl
Quindi ci sono due comandi passati con -c o uno ?
start()
{
echo $"Starting PostgreSQL 9.1: "
su - postgres -c "LD_LIBRARY_PATH=/opt/PostgreSQL/9.1/lib:$LD_LIBRARY_PATH /opt/PostgreSQL/9.1/bin/pg_ctl -w start -D \"/opt/PostgreSQL/9.1/data\" -l \"/opt/PostgreSQL/9.1/data/pg_log/startup.log\""
if [ $? -eq 0 ];
then
echo "PostgreSQL 9.1 started successfully"
exit 0
else
echo "PostgreSQL 9.1 did not start in a timely fashion, please see /opt/PostgreSQL/9.1/data/pg_log/startup.log for details"
exit 1
fi
}
Risposta accettata:
È un singolo comando passato alla shell. La shell consente di impostare le variabili di ambiente in base al comando, ad esempio:
PGPORT=5433 psql
su
invoca la shell con il suo argomento, quindi:
su -c 'PGPORT=5433 psql'
è come fare:
su
exec bash -c 'PGPORT=5433 psql'
Francamente, tendo a preferire l'uso di sudo, che semplifica l'impostazione delle variabili di ambiente e gestisce correttamente i comandi con citazioni complesse perché non passa tramite la shell.