以下のスクリプトを理解しようとしていますが、suラインが混乱しています。私はpostgresコマンドラインパラメータを理解します。
man su
マニュアル通りに従うとこんな感じです。
-c, --command=COMMAND 単一の COMMAND をシェルに渡すには、-c を使用します。
ただし、次の行にはsu - postgres -c ...
2つのコマンドが含まれているようです。
- 最初は環境変数LD_LIBRARYを設定します。
- 2番目はpg_ctlを呼び出します。
もしそうなら、2つのコマンドは-cを通して渡されますか、それとも1つのコマンドは-cを通して渡されますか?
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
}
答え1
これはシェルに渡される単一のコマンドです。シェルを使用すると、各コマンドの環境変数を設定できます。たとえば、次のようになります。
PGPORT=5433 psql
su
シェルは引数とともに呼び出されるので、次のようになります。
su -c 'PGPORT=5433 psql'
次のことを行います。
su
exec bash -c 'PGPORT=5433 psql'
正直なところ、私はsudoを使う方です。 sudoを使用するとシェルを通過しないため、環境変数を簡単に設定し、複雑な参照を含むコマンドを適切に処理できます。