Mar 9, 2014

Ubuntu Lesson 11 - Run .sh 到底是在那個shell內?

假設要執行一個shell script "run.sh",以下指令有何不同?
  1. ./run.sh
  2. . run.sh
  3. source run.sh
以設定PATH為例,可以了解差別。QDK需要加入對的路徑到PATH中,qbuild才可以執行,為了避免每次都打很長指令,寫個.sh (vi pQDK.sh)。
export PATH=$PATH:/share/MD0_DATA/.qpkg/QDKecho $PATH~~

存檔結束vi後,從以下指令觀察差別。
[/share/Public] # echo $PATH /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin[/share/Public] # ./pQDK.sh /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin:/share/MD0_DATA/.qpkg/QDK
[/share/Public] # echo $PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin[/share/Public] # . pQDK.sh /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin:/share/MD0_DATA/.qpkg/QDK
[/share/Public] # echo $PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin:/share/MD0_DATA/.qpkg/QDK
[/share/Public] #

常用的./pQDK.sh是呼叫新的shell (i.e., sub-shell, 與sh pQDK.sh相同, 在Ubuntu中sh symbolic link到/bin/bash),在.sh執行完之後,就會exit跳出sub-shell。但是. pQDK.sh (與source pQDK.sh相同) 是在原shell context內執行,因此echo $PATH後,這才會達到想要目的。

試著將pQDK.sh加一行exit指令,再重新執行看看。
export PATH=$PATH:/share/MD0_DATA/.qpkg/QDKecho $PATHexit~

前面兩個指令先將PATH復原,並確認已經復原。
./pQDK.sh執行到最後一行exit,自行跳出sub-shell,所以沒影響。但是. pQDK.sh (與source pQDK.sh相同) 是在原shell context內執行,因此最後一行exit就將自己踢出ssh session。
[/share/Public] # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin
[/share/Public] # echo $PATH /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin[/share/Public] # ./pQDK.sh /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin:/share/MD0_DATA/.qpkg/QDK[/share/Public] # echo $PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin[/share/Public] # . pQDK.sh /bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/opt/bin:/opt/sbin:/share/MD0_DATA/.qpkg/QDKConnection to 192.168.0.110 closed.NaCl plugin exited with status code 0.(R)econnect, (C)hoose another connection, or E(x)it?

類似在Ubuntu常搞不清楚的問題,就是su之後shell所在環境?
Ubuntu Lesson 09 - 登入後立即檢查套件和軟體更新
  • "su": 用root登入,但是shell還是原先登入使用者的環境,以 "pwd" 就可知當前路徑。
  • "su -": 用root登入,而且shell環境也是root。
Linux/Ubuntu的指令要非常注意space, -, --, ./, . , 等,差一點就差很多。


No comments :

Post a Comment