su -c命令與環境變量的困惑

http://bbs.chinaunix.net/thread-2003718-1-1.html

[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 ~]# 




命令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用戶環境下執行的,所以沒問題。



整條命令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下的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章