J'essaie de comprendre le script ci-dessous et je suis confus au sujet de la ligne su. Je comprends les arguments de la ligne de commande postgres.
quand je fais man su
le manuel dit
-c, –command=COMMAND
passe une seule COMMANDE au shell avec -c
Cependant la ligne avec le su - postgres -c ...
semble contenir deux commandes
- première configuration de la variable d'environnement LD_LIBRARY
- deuxième appelant pg_ctl
Donc, y a-t-il deux commandes passées avec -c ou une ?
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
}
Réponse acceptée :
C'est une seule commande passée au shell. Le shell vous permet de définir des variables d'environnement pour chaque commande, par exemple :
PGPORT=5433 psql
su
invoque le shell avec son argument, donc :
su -c 'PGPORT=5433 psql'
c'est comme faire :
su
exec bash -c 'PGPORT=5433 psql'
Franchement, j'ai tendance à préférer utiliser sudo, qui facilite la définition des variables d'environnement et gère correctement les commandes avec des guillemets complexes car cela ne passe pas par le shell.