Como esse comando su -c “…” parece passar dois comandos ao invés de um?

4

Estou tentando entender o roteiro abaixo e estou confuso sobre a linha su. Eu entendo os argumentos da linha de comando do postgres.

quando eu faço man su o manual diz

-c, --command=COMMAND pass a single COMMAND to the shell with -c

No entanto, a linha com o su - postgres -c ... parece conter dois comandos

  • primeiro definindo a variável de ambiente LD_LIBRARY
  • segunda chamada pg_ctl

Existem dois comandos sendo passados com -c ou um?

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
}
    
por ams 23.08.2013 / 05:09

1 resposta

11

É um único comando passado para o shell. O shell permite que você defina variáveis de ambiente por comando, por exemplo:

PGPORT=5433 psql

su chama o shell com seu argumento, então:

su -c 'PGPORT=5433 psql'

é como fazer:

su
exec bash -c 'PGPORT=5433 psql'

Sinceramente, eu prefiro usar o sudo, o que facilita a configuração de variáveis de ambiente e lida com comandos com citações complexas, porque não é feito através do shell.

    
por 23.08.2013 / 05:13