이 su -c "..." 명령은 하나가 아닌 두 개의 명령을 전달하는 것 같습니다.

이 su -c "..." 명령은 하나가 아닌 두 개의 명령을 전달하는 것 같습니다.

아래 스크립트를 이해하려고 노력 중인데 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를 사용하면 쉘을 거치지 않기 때문에 환경 변수를 쉽게 설정하고 복잡한 참조가 포함된 명령을 적절하게 처리할 수 있습니다.

관련 정보