5

Can anyone explain this:

~$ echo $PGDATA
/Library/PostgreSQL/9.2/data

~$ cd /Library/PostgreSQL/9.2/

/Library/PostgreSQL/9.2$ sudo su postgres

bash-3.2$ echo $PGDATA
<blank line>   

bash-3.2$ pg_ctl start
pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.

bash-3.2$ export PGDATA="/Library/PostgreSQL/9.2/data"

bash-3.2$ pg_ctl start
server starting

bash-3.2$ 

The following is in my ~/.bashrc file:

export PGDATA="/Library/PostgreSQL/9.2/data"

I'm not mis-spelling the path in PGDATA:

                ~$ echo $PGDATA
                /Library/PostgreSQL/9.2/data
 export PGDATA="/Library/PostgreSQL/9.2/data"
4
  • sudo can't be assumed to keep the environment variables of its caller. See its manpage for the details with your specific OS. Commented Sep 25, 2014 at 19:12
  • 1
    When I su to postgres I do su - postgres. Notice the hyphen. Commented Sep 25, 2014 at 19:21
  • @DanielVérité, Thanks for taking a look! I addressed your comment in an answer. Commented Sep 25, 2014 at 20:02
  • @ClodoaldoNeto, Thanks for taking a look! I addressed your comment in an answer. Commented Sep 25, 2014 at 20:03

1 Answer 1

3

sudo can't be assumed to keep the environment variables of its caller. See its manpage for the details with your specific OS.

As far as I know, environment variables are attached to a shell, and as far as I can tell I'm in the same shell.

This works for me:

~$ cd /Library/PostgreSQL/9.2/
/Library/PostgreSQL/9.2$ sudo -E su postgres  

...

   -E          The -E (preserve environment) option will override the
               env_reset option in sudoers(5)).  It is only available when
               either the matching command has the SETENV tag or the
               setenv option is set in sudoers(5).

I only understand the following:

The -E (preserve environment) option

Next comment:

When I su to postgres I do su - postgres. Notice the hyphen.

Here is what my man pages say about the hyphen:

 -l      Simulate a full login.  The environment is discarded except for
         HOME, SHELL, PATH, TERM, and USER.  HOME and SHELL are modified
         as above.  USER is set to the target login.  PATH is set to
         ``/bin:/usr/bin''.  TERM is imported from your current environ-
         ment.  The invoked shell is the target login's, and su will
         change directory to the target login's home directory.

 -       (no letter) The same as -l.

I don't see how that will preserve the PGDATA environment variable, and this is what happened when I tried the hyphen:

/Library/PostgreSQL/9.2$ sudo su - postgres
Password:
7studs-computer:~ postgres$ ls
bin             pgAdmin3.app
data                pg_env.sh
doc             scripts
include             share
installer           stackbuilder.app
lib             uninstall-postgresql.app
7studs-computer:~ postgres$ pg_ctl start
-bash: pg_ctl: command not found
7studs-computer:~ postgres$ ls 
bin             pgAdmin3.app
data                pg_env.sh
doc             scripts
include             share
installer           stackbuilder.app
lib             uninstall-postgresql.app
7studs-computer:~ postgres$ cd bin
7studs-computer:bin postgres$ ls
clusterdb       pg_config       pgbench
createdb        pg_controldata      pltcl_delmod
createlang      pg_ctl          pltcl_listmod
createuser      pg_dump         pltcl_loadmod
dropdb          pg_dumpall      postgres
droplang        pg_receivexlog      postmaster
dropuser        pg_resetxlog        psql
ecpg            pg_restore      reindexdb
initdb          pg_standby      vacuumdb
oid2name        pg_test_fsync       vacuumlo
pg_archivecleanup   pg_test_timing
pg_basebackup       pg_upgrade
7studs-computer:bin postgres$ ./pg_ctl start
pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.
7studs-computer:bin postgres$ 

So the hyphen doesn't work for me (OSX 10.6.8).

Sign up to request clarification or add additional context in comments.

2 Comments

I'm in the same shell: no you can't impersonate a user in the same shell. You may check this by yourself with echo $$ to display the PID of the current shell. The empty value of $PGDATA after sudo su is evidence that the environment has been renewed. The only problem is you don't seem to want to believe it.
The only problem is you don't seem to want to believe it. lol

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.