这个 su -c "..." 命令似乎传递了两个命令而不是一个命令?

ams*_*ams 7 bash su shell-script

我试图理解下面的脚本,但我对 su 行感到困惑。我了解 postgres 命令行参数。

当我做man su手册时说

-c, --command=COMMAND 使用 -c 将单个 COMMAND 传递给 shell

但是,带有的行su - postgres -c ...似乎包含两个命令

  • 第一个设置 LD_LIBRARY 环境变量
  • 第二个调用 pg_ctl

那么是否有两个命令通过 -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
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 14

这是传递给 shell 的单个命令。shell 允许您在每个命令的基础上设置环境变量,例如:

PGPORT=5433 psql
Run Code Online (Sandbox Code Playgroud)

su 用它的参数调用 shell,所以:

su -c 'PGPORT=5433 psql'
Run Code Online (Sandbox Code Playgroud)

就像在做:

su
exec bash -c 'PGPORT=5433 psql'
Run Code Online (Sandbox Code Playgroud)

坦率地说,我倾向于使用 sudo,这使得设置环境变量变得容易,并且可以正确处理复杂引用的命令,因为它不通过 shell。