1. 程式人生 > >【Shell】關於shell指令碼中執行cd命令無效的分析

【Shell】關於shell指令碼中執行cd命令無效的分析

###Date: 2017/1/7

###Author: SoaringLee

###Content:關於shell指令碼中執行cd命令無效的分析

=======================================================================

緣起:

   我在shell中寫cd目錄為什麼不會到我想去的目錄中? 

    shell指令碼中使用cd命令進入到指定目錄後,然後執行該目錄下的命令,在執行shell指令碼後發現不能進入到指定目錄中,因而後續命令會因為找不到而報錯?

例子:

編寫shell指令碼test.sh

  1. #!/bin/sh

  2. cd Tools/vmware-tools-distrib

  3. pwd

在Terminal中執行./test.sh,結果如下:

  1. [email protected]:~/Desktop$ ./test.sh

  2. /home/soaringlee/Desktop/Tools/vmware-tools-distrib

  3. [email protected]:~/Desktop$

因而並沒有進入到指定目錄中。

在Terminal中執行source test.sh,結果如下:

  1. [email protected]:~/Desktop$ source test.sh

  2. /home/soaringlee/Desktop/Tools/vmware-tools-distrib

  3. [email protected]:~/Desktop/Tools/vmware-tools-distrib$

因此採用source命令執行該指令碼,進入到了指定目錄中。

  1. [email protected]:~/Desktop$ . test.sh

  2. /home/soaringlee/Desktop/Tools/vmware-tools-distrib

  3. [email protected]:~/Desktop/Tools/vmware-tools-distrib$

採用點命令執行該指令碼,也可以實現進入到指定目錄中。
 

原因:

    採用第一種方法是直接執行該指令碼,會建立一個子shell,並在子shell中逐個執行指令碼中的指令; 而子shell從父shell中繼承了環境變數,但是執行後不會改變父shell的環境變數;可以這樣理解:在子shell中的操作和環境變數不會影響父程序,在執行完shell後又回到了父程序。

    採用第二種方法執行該指令碼,source命令是在當前shell環境下執行該指令碼,不會建立子shell,因而可以在shell中進入到指定目錄中。

    source命令又稱為點命令,作用:在當前shell環境下讀取並執行指令碼中的命令,通常用於重新執行剛修改過的初始化檔案,使之立即生效,而不必登出並登入。

參考:

http://blog.csdn.net/codigger/article/details/9187989

http://bbs.51cto.com/thread-1319831-1-1.html

http://blog.csdn.net/czg13548930186/article/details/72861086

https://www.cnblogs.com/sparkbj/p/5976100.html

相關推薦

Shell關於shell指令碼執行cd命令無效分析

###Date: 2017/1/7 ###Author: SoaringLee ###Content:關於shell指令碼中執行cd命令無效的分析 ===========================================================

在網頁執行VB6程式

用VB6做的程式在網頁裡執行, 需要把程式做成OCX格式,下面簡單做一介紹: 首先新建一個工程, 選擇ActivX控制元件:    然後新增控制元件和程式碼:     然後F5執行    然後按下圖設定,去掉彈出訊息阻止         這樣就製作完成了。  最後把OCX編譯,把這個網頁另存到本地,將2

LoadRunner解決指令碼字元型轉浮點型或由浮點型轉字元型

double atof( const char *string);  //申明函式 Action() {          float UpPrice1;         float i=0.1;         char* price1=(char*)calloc(10

如何在 Shell 指令碼執行語法檢查除錯模式

我們開啟了 Shell 指令碼除錯系列文章,先是解釋了不同的除錯選項,下面介紹如何啟用 Shell 除錯模式。 寫完指令碼後,建議在執行指令碼之前先檢查指令碼中的語法,而不是檢視它們的輸出以確認它們是否正常工作。 在本系列的這一部分,我們將瞭解如何使用語法檢查除錯模式

Jenkins——shell執行多個指令碼

前言   前面已經寫了一篇部落格   上篇部落格中只提到了在shell中只執行一個指令碼,生成對應的jtl檔案   並對其進行資料分析。   有些時候我們可能需要測試很多的指令碼,但是因為每

Shellshell指令碼的空格

1.定義變數時, =號的兩邊不可以留空格. eg: gender=femal————right gender =femal———–wrong gender= femal———–wrong gender= test————right 左邊是命令的話=號的右邊有空格是正

shellshell指令碼在大檔案日誌按照時間段快速搜尋日誌

問題描述: 在大流量線上服務中,日誌系統會產生數量龐大的日誌,動輒就是幾十G。在如此之大的檔案中快速搜尋日誌是運維人員經常遇見的問題。我們經常遇見的問題是查詢一段時間內的某些條日誌。比如,今天有一

shell腳本執行時報"bad interpreter: Text file busy"的解決方法

and files hat scrip proc nbsp comm this rep 1)問題現象: 在ubuntu下執行以下腳本( while_count),報錯: -bash: ./while_count: /bin/bash: bad interpreter: T

shell命令>/dev/null 2>&1的實現原理

情況 內存 顯示 都是 style hand 引用 nis roo 異步執行 exec("/alidata/server/php/bin/php /nas/wxdoctor/index.php App/Common/WordsPic/user_id/".$user_

轉載shellEOF的用法

shel mys only 輸入 sele eof mar 用法 passwd Shell中通常將EOF與 << 結合使用,表示後續的輸入作為子命令或子Shell的輸入,直到遇到EOF為止,再返回到主調Shell。可以把EOF替換成其他東西意思是把內容當作標準輸

linuxshell指令碼除錯技術

在使用gcc編譯keepalived原始碼的時候,需要執行configure生成Makefile,然後用make命令編譯。但是在這個過程中,configure檔案卻一直無法掃描到一個已經安裝的三方庫。無奈,只能檢視configure原始碼。configure其實就是一個shell指令碼,為了

Shell 指令碼執行mysql語句

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SVshell指令碼程式獲得隨機數方法

轉載: https://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html shell指令碼程式獲得隨機數方法:date 一、通過時間獲得隨機數(date) 這個也是我們經常用到的,可以說時間是唯一的,也不會重複的,從這

Shell指令碼IF條件判斷和判斷條件總結

1、基本語法: if [ command ]; then 符合該條件執行的語句 fi 2、擴充套件語法: if [ command ];then 符合該條件執行的語句 elif [ command ];then 符合該條件執行的語句 else 符合該條件執行的

linux利用shell指令碼條件執行linux命令

linux中利用shell指令碼條件執行命令 在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的(以跳轉不

linux的shell指令碼執行多個命令的方法

第一種是以分號(;)進行劃分:表示:各命令的執行的果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。 第二種命令之間&&隔開 表示:若前面的命令執

XcodeShell指令碼自動打包ipa加企業版簽名

支援原創,更多內容請訪問部落格: 提交給測試同時 ipa 的時候,打包的過程都是重複性的工作,而且人工操作容易造成錯誤,提交測試之後才能發現,導致返工。如果公司有 Mac 伺服器的話,可以搭建 Jenkins 持續整合環境,如果沒有條件,也可以自行寫指令碼一鍵打包。下面

高效率shell指令碼一鍵安裝Tomcat服務

指令碼環境 1.linux centos 7或redhat 62.光碟映象檔案已掛載3.系統在可連線外網的環境中4.先下載jdk和tomcat軟體包百度雲連結提取碼:89be 實驗步驟 1.上傳軟體包到Linux系統中2.編寫指令碼vim tomcat.sh #!/bin/bash#t

LinuxShell - 字串插入字元

str="20171125" $ echo ${str:0:4}-${str:4:2}-${str:6} 2017-11-25 取子串 * $ var="get length of me" $ echo ${var:0:3} get $ echo ${var(-2)

LinuxShell - 指令碼練習 - 擷取檔案內容

寫一個指令碼 依次向/etc/passwd中的每個使用者問好,並且說出對方的ID是什麼 例如:Hello root, your UID is0. 方法1:使用awk指定分隔符 cat /etc/passwd | awk -F ":" '{print "H