今天在Linux下维护Oracle数据库时,查看监听的状态,执行
#lsnrctl status
报错: -bash:lsnrctl:command not found。以前并不会这样,仔细想了一下,问题找到了,我是以root远程登录到服务器上,维护oracle时,直接 su oracle,这样操作虽然用户切换为oracle,但是环境变量仍然是root的环境变量,所以会报环境变量错误,正确的命令是su - oracle,这样环境变量也会切换为oracle的环境变量。
看一下 su 命令的 man page
NAME
su - run a shell with substitute user and group IDs
SYNOPSIS
su [OPTION]... [-] [USER [ARG]...]
DESCRIPTION
Change the effective user id and group id to that of
USER.
-, -l, --login
make the shell a login shell, clears all envvars
except for TERM, initializes HOME, SHELL, USER,
LOGNAME and PATH
...
A mere - implies -l. If USER not given, assume root.
可以看到,加了 - 选项后,会清空除term外的环境变量,重新初始化HOME、SHELL、USER、LOGNAME和PATH。
所以要多注意细节,尤其Linux下面,一点点的不一样,都有可能引起完全不同的结果。