我试图理解下面的脚本,但我对 su 行感到困惑。我理解 postgres 命令行参数。
当我按照man su
手册说的时候
-c, --command=COMMAND 使用 -c 将单个 COMMAND 传递到 shell
然而,带有 的行su - postgres -c ...
似乎包含两个命令
- 第一个设置 LD_LIBRARY 环境变量
- 第二个调用 pg_ctl
那么是通过 -c 传递两个命令还是一个通过 -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
这是传递到 shell 的单个命令。 shell 允许您为每个命令设置环境变量,例如:
PGPORT=5433 psql
su
使用其参数调用 shell,因此:
su -c 'PGPORT=5433 psql'
就像做:
su
exec bash -c 'PGPORT=5433 psql'
坦率地说,我倾向于使用 sudo,这使得设置环境变量变得容易,并正确处理具有复杂引用的命令,因为它不通过 shell。