Postgresql Postgres无法查看我的PGDATA环境变量

Postgresql Postgres无法查看我的PGDATA环境变量,postgresql,environment-variables,Postgresql,Environment Variables,谁能解释一下: ~$ 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 environm

谁能解释一下:

~$ 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$ 
我没有在PGDATA中拼写错误路径:

                ~$ echo $PGDATA
                /Library/PostgreSQL/9.2/data
 export PGDATA="/Library/PostgreSQL/9.2/data"
不能假设sudo保留其调用者的环境变量。 有关特定操作系统的详细信息,请参见其手册页

据我所知,环境变量被附加到一个shell,据我所知,我在同一个shell中

这对我很有用:

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

我只明白以下几点:

The -E (preserve environment) option
下一条评论:

当我读大学预科时,我读大学预科。注意连字符

以下是我的手册页中关于连字符的内容:

 -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.
/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$ 
我不知道这将如何保留PGDATA环境变量,这就是我尝试连字符时发生的情况:

 -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.
/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$ 

因此连字符对我不起作用(OSX 10.6.8)。

sudo
不能被假定为保留调用者的环境变量。有关特定操作系统的详细信息,请参见其手册页。当我
su
postgres
时,我会
su-postgres
。请注意连字符。@DanielVérité,谢谢您的关注!我在回答中提到了你的评论。@ClodoaldoNeto,谢谢你的关注!我在回答中提到了你的评论。我在同一个shell中:不,你不能在同一个shell中模拟用户。您可以自己用
echo$$
检查,以显示当前shell的PID。
sudo su
之后的
$PGDATA
空值表明环境已更新。唯一的问题是你似乎不想相信它,唯一的问题是你似乎不想相信它。英雄联盟