environment-variables - 在 sudo 内部,当命令内联而不是调用第二个脚本时,未设置环境变量
问题描述
我正在以 root 身份运行 korn shell 脚本,需要对不同的用户(oracle)执行 sudo 以执行一些命令,并且我需要访问 .profile 中设置的环境变量。
如果我调用第二个脚本来执行命令而不是内联执行它们,我会看到不同的行为。
这是一个简单的测试来演示。这有效并显示 $ORACLE_HOME 环境变量:
sudo su - oracle -s /bin/ksh -c "/home/u6vzbes/upgrade/get_oracle_home_test.ksh"
被调用的脚本就是这样的:
#!/bin/ksh
echo 'Called from script - ORACLE_HOME is ' ${ORACLE_HOME}
但这不起作用, $ORACLE_HOME 环境变量为空:
sudo su - oracle -s /bin/ksh -c "
echo 'Called from sudo - Oracle home is ${ORACLE_HOME}'
"
为什么这两者的工作方式不同?我更喜欢内联执行命令而不是第二个脚本,因为我需要在整个根脚本中多次使用 sudo 到 oracle。仅供参考,环境变量是在 oracle 用户的 .profile 中设置的。
解决方案
' 转义在这种情况下不起作用。以下工作,转义 $ 字符:
sudo su - oracle -s /bin/ksh -c "echo Called from sudo - Oracle home is \${ORACLE_HOME}"
所以删除 ' 并将 \ 放在 $ 前面
推荐阅读
- git - 在 Git 存储库中保留“硬编码”版本号的最佳方法
- hashmap - 用另一个 HashMap 的内容扩展 HashMap
- java - 使用 Spring 和 Parameterized 运行 JUnit
- c# - 如何手动信任嵌入在我的应用程序中的自签名证书?
- python - 遍历多个数据框并根据特定列执行计算
- angularjs - 如何修复我的代码?angularjs,ejs代码
- angular - 如何在 Angular 5 或更高版本中以编程方式获取 formControlName
- javascript - Javascript 使用 document.onclick 关闭下拉菜单
- firebase - 为什么这个 push() 覆盖而不是添加?
- css - 难以掌握 react 或 CSS 的用法