このsu -c "..."コマンドは、1つではなく2つのコマンドを渡すようです。

このsu -c

以下のスクリプトを理解しようとしていますが、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を使用するとシェルを通過しないため、環境変数を簡単に設定し、複雑な参照を含むコマンドを適切に処理できます。

おすすめ記事