当前位置: 首页 > 知识库问答 >
问题:

bash - 如何解决 su 命令导致的环境变量丢失问题?

扈昀
2024-03-13

现在在编写一个脚本,希望在root用户下收集oracle用户下的一些信息,但是发现在脚本中切换用户执行命令会出现环境变量问题。

[root@oracle01 ~]# su - oracle -c "$ORACLE_HOME/OPatch/opatch lsinventory"-bash: /OPatch/opatch: No such file or directory[root@oracle01 ~]# su - oracle -c "echo $ORACLE_HOME"[root@oracle01 ~]# 

如上面的命令所示,ORACLE_HOME是个空。
oracle用户下确实设置了环境变量,但是使用su - oracle -c "echo $ORACLE_HOME"这种样子查看时却显示该变量为空。

要如何才能在切换oracle用户后正确使用$ORACLE_HOME变量呢?

[root@oracle01 ~]# su - oracleLast login: Wed Mar 13 16:20:05 CST 2024 on pts/0[oracle@oracle01 ~]$ cat ~/.bash_profile ...省略一些输出export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1...省略一些输出[oracle@oracle01 ~]$ echo $ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1[oracle@oracle01 ~]$ exitlogout[root@oracle01 ~]# [root@oracle01 ~]# su - oracle -c "env|grep ORACLE_HOME"ORACLE_HOME=/01/app/oracle/product/11.2.0/db_1[root@oracle01 ~]# su - oracle -c "echo $ORACLE_HOME"[root@oracle01 ~]# 

共有1个答案

万嘉熙
2024-03-13

在Linux中,环境变量通常是在用户的shell会话中设置的。当你使用su命令切换用户时,新的shell会话会被启动,并且会读取该用户的配置文件(如.bash_profile.bashrc)来设置环境变量。然而,当你使用su - oracle -c "command"的形式时,command是在一个非交互式的shell中执行的,这意味着它不会读取用户的配置文件,因此环境变量也不会被设置。

要解决这个问题,你可以使用以下方法之一:

  1. 在命令行中直接设置环境变量
    su命令中直接设置所需的环境变量。例如:
su - oracle -c "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1; $ORACLE_HOME/OPatch/opatch lsinventory"
  1. 使用-s选项
    使用su命令的-s选项来启动一个新的shell,并读取用户的配置文件。例如:
su -s /bin/bash oracle -c "echo $ORACLE_HOME"

这里,/bin/bash是oracle用户的默认shell。使用-s选项将确保shell会读取用户的配置文件并设置环境变量。

  1. 使用source或.命令
    su命令中,你可以使用source.命令来在当前shell中读取用户的配置文件。例如:
su - oracle -c "source ~/.bash_profile; echo $ORACLE_HOME"

或者

su - oracle -c ". ~/.bash_profile; echo $ORACLE_HOME"

选择适合你需求的方法,并确保在脚本中使用正确的方式来设置环境变量。

 类似资料:
  • 本文向大家介绍cmd环境变量命令set 设置永久环境变量命令setx,包括了cmd环境变量命令set 设置永久环境变量命令setx的使用技巧和注意事项,需要的朋友参考一下 set命令 set命令用于设置当前cmd窗口中的环境变量,只在当前cmd窗口有效,cmd窗口关闭后将会失效,而其不会影响到系统中保存的用户环境变量。 setx命令 setx设置永久用户环境变量 setx env_name env

  • 我有两个shell脚本: 第一个:<代码>1。sh,其内容如下: 第二:<代码>2。sh,其内容如下: 两者都具有执行权限。当我运行<代码>2时。sh,我希望环境变量PROP由1设置和导出。sh,对。这里怎么了?

  • 我需要导出很多变量,比如export x1=1 export x2=2 我移动了文件中的所有变量。环境和尝试 源代码 之后我处决了 所有这些变量都不在环境变量列表中。我还尝试了

  • 我对lua脚本的功能很陌生。我试过用, 操作系统。执行(“导出MY_VAR=10”) 伊奥。popen(“导出MY_VAR=10”) 从 lua 脚本。 我尝试在执行lua脚本后使用 echo $MY_VAR 从 shell 中读取MY_VAR变量,但我没有看到MY_VAR设置为 10。 如何使用lua脚本设置环境变量?

  • 问题内容: 在安装gnuplot之前,我先设置环境变量。在安装过程中,出现了问题。 我想删除环境变量。我该如何实现? 问题答案: 是您要查找的命令。

  • 问题内容: Jenkins参数区分大小写吗?我有一个参数化的构建,需要在构建之前设置一个名为“ build_parameter”的蚂蚁参数。当我尝试访问Jenkins设置的$ {BUILD_NUMBER}时,我得到了为ant参数设置的值。如果构建参数不区分大小写,那么有人可以建议我解决此问题吗?我无法更改构建参数名称,因为必须更改构建脚本(这不是一个选择)。谢谢! 问题答案: 为了回答您的第一个问