아래 스크립트를 이해하려고 노력 중인데 su 라인이 헷갈립니다. 나는 postgres 명령줄 매개변수를 이해합니다.
man su
설명서대로 따라하니 이렇게 나오네요
-c, --command=COMMAND 단일 COMMAND를 쉘에 전달하려면 -c를 사용하십시오.
그러나 다음 줄에는 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
이는 쉘에 전달되는 단일 명령입니다. 셸을 사용하면 각 명령에 대한 환경 변수를 설정할 수 있습니다. 예를 들면 다음과 같습니다.
PGPORT=5433 psql
su
쉘은 인수와 함께 호출되므로 다음과 같습니다.
su -c 'PGPORT=5433 psql'
다음과 같은 일을 하세요:
su
exec bash -c 'PGPORT=5433 psql'
솔직히 저는 sudo를 사용하는 편입니다. sudo를 사용하면 쉘을 거치지 않기 때문에 환경 변수를 쉽게 설정하고 복잡한 참조가 포함된 명령을 적절하게 처리할 수 있습니다.