忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 24725 | 回复: 19

su -c命令与环境变量的困惑 [复制链接]

论坛徽章:
0
发表于 2009-02-02 11:18 |显示全部楼层
[root@localhost ~]# su - oracle
    [oracle@localhost ~]$ $ORACLE_HOME/a.sh
    this is a.sh
    [oracle@localhost ~]$

上面的命令都正常,但是下面的命令则无法运行:
    [root@localhost ~]# su - oracle -c "$ORACLE_HOME/a.sh"
    -bash: /a.sh: 没有那个文件或目录
    [root@localhost ~]#

下面的命令也没问题:
    [root@localhost ~]# su - oracle -c "ls $ORACLE_HOME"
       admin             Disk3    oraInventory    ra_createdb.log     ra_idx01.dbf     ra.sql      
       ship_9204_linux_disk1.cpio.gz
       createrauser.sql  doc      oui             ra_createtable.log  ra_initData.log  scgs_ca.dmp  
       ship_9204_linux_disk2.cpio.gz
       Disk1             jre      procedurel.log  ra_data01.dbf       ra_rbs01.dbf     scgs_km.dmp   
       ship_9204_linux_disk3.cpio.gz
       Disk2             oradata  product         ra_data02.dbf       ra_scgs.dmp      scgs_ra.dmp  temp01.dbf
[root@localhost ~]#

谁能告诉我这是为什么?先谢过了。

论坛徽章:
2
丑牛
日期:2014-06-11 13:55:04ChinaUnix元老
日期:2015-02-06 15:16:14
发表于 2009-02-02 11:28 |显示全部楼层
su - uid -c 命令不自动执行.profile脚本

你可以在a.sh加一行执行一下

论坛徽章:
0
发表于 2009-02-02 13:14 |显示全部楼层
命令su - oracle -c "$ORACLE_HOME/a.sh"是在当前的Shell下执行的,因为root shell下面没有定义ORACLE_HOME,所以上面命令相当于su - oracle -c "/a.sh"

su - oracle -c "ls $ORACLE_HOME"中的命令 ls $ORACLE_HOME是切换到oracle用户环境下执行的,所以没问题。

2楼说的不对 su - oracle -c "command" 是会调用oracle的配置文件的,su  oracle -c "command"才不调用。

论坛徽章:
0
发表于 2009-02-02 14:38 |显示全部楼层
3楼的:
su - oracle -c "ls $ORACLE_HOME"是在用户oracle的环境下执行的,这很好理解。
为什么su - oracle -c "$ORACLE_HOME/a.sh"是在root的Shell下执行的?

论坛徽章:
2
丑牛
日期:2014-06-11 13:55:04ChinaUnix元老
日期:2015-02-06 15:16:14
发表于 2009-02-02 14:57 |显示全部楼层

回复 #3 slurker 的帖子

谢谢3楼指正,我看错了

论坛徽章:
0
发表于 2009-02-02 15:56 |显示全部楼层
原帖由 pantaiyang 于 2009-2-2 14:38 发表
3楼的:
su - oracle -c "ls $ORACLE_HOME"是在用户oracle的环境下执行的,这很好理解。
为什么su - oracle -c "$ORACLE_HOME/a.sh"是在root的Shell下执行的?


我的意思是整条命令su - oracle -c "$ORACLE_HOME/a.sh"是你在root的shell下敲的,
所以命令里面变量$ORACLE_HOME被替换成值,就成了su - oracle -c "/a.sh"
就是-c 后面跟着的字符串在传递给oracle前已经被处理过了,已经变成了"/a.sh";
你第二条命令里oracle用户执行的也不是 ls $ORACLE_HOME,其实执行的命令是ls,显示的是oracle用户主目录下的东东
不信你可以把oracle profile里的ORACLE_HOME改为/tmp试一下,命令su - oracle -c "ls $ORACLE_HOME"显示的内容和现在
一样,不会是/tmp下的内容

不知道说清楚了没有。

[ 本帖最后由 slurker 于 2009-2-2 15:58 编辑 ]

论坛徽章:
0
发表于 2009-02-02 17:49 |显示全部楼层
原帖由 slurker 于 2009-2-2 15:56 发表


我的意思是整条命令su - oracle -c "$ORACLE_HOME/a.sh"是你在root的shell下敲的,
所以命令里面变量$ORACLE_HOME被替换成值,就成了su - oracle -c "/a.sh",
就是-c 后面跟着的字符串在传递给oracle前已 ...


LZ敲的是: su - oracle 那么 -, -l,--login 会创建一个login shell

论坛徽章:
0
发表于 2009-02-02 19:28 |显示全部楼层

回复 #1 pantaiyang 的帖子

su -l oracle 命令

论坛徽章:
0
发表于 2009-02-02 19:39 |显示全部楼层
原帖由 kns1024wh 于 2009-2-2 19:28 发表
su -l oracle 命令


su -l oracle command是不行的,在su手册中,su后跟命令必须使用-c 来指定
  -c, --commmand=COMMAND
              pass a single COMMAND to the shell with -c

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2009-02-02 21:17 |显示全部楼层

回复 #1 pantaiyang 的帖子

这个应该是SHELL的问题..
在shell中,变量会先转换....在这里$ORACLE_HOME 由于在root用户下未定义,故为空,则$ORACLE_HOME/a.sh变成了/a.sh
因为$ORACLE_HOME为空嘛..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP