假設要執行一個shell script "run.sh",以下指令有何不同?
- ./run.sh
- . run.sh
- 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