shell執行命令的方式

2021-06-02 15:10:05 字數 3130 閱讀 7982

想寫這篇文章還得從執行乙個指令碼說起

nohup sh run.sh &

看到這樣執行指令碼的方式,剛開始有點不知所措,經過一番理解之後才發現這樣的執行方式考慮的真的很周全

用sh執行指令碼好處是不管指令碼有沒有執行許可權都可以被執行

【不管相對路徑./run.sh還是絕對路徑執行/home/sas/cmnew/adventnet/sas/bin/run.sh ,都需要執行許可權】

&符號表示將指令碼放到後台執行,但是如果關閉當前的終端的話,指令碼就會被終止

如果加上nohup再執行指令碼的話,即使終端被關閉,指令碼也會繼續在後台執行

所以nohup和&是雙保險

nohup sh run.sh &  就是為了安全並順利地執行指令碼

下面主要介紹執行shell指令碼的幾種方式

使用者在命令列輸入命令後,一般情況下shell會forkexec該命令,但是shell的內建命令例外,執行內建命令相當於呼叫shell程序中的乙個函式,並不建立新的程序。以前學過的cdaliasumaskexit等命令即是內建命令,凡是用which命令查不到程式檔案所在位置的命令都是內建命令,內建命令沒有單獨的man手冊,要在man手冊中檢視內建命令,應該

$ man bash-builtins
本節會介紹很多內建命令,如exportshiftifeval[forwhile等等。內建命令雖然不建立新的程序,但也會有exit status,通常也用0表示成功非零表示失敗,雖然內建命令不建立新的程序,但執行結束後也會有乙個狀態碼,也可以用特殊變數$?讀出。

首先編寫乙個簡單的指令碼,儲存為script.sh

例 31.1. 簡單的shell指令碼

#! /bin/sh

cd ..

ls

shell指令碼中用#表示注釋,相當於c語言的//注釋。但如果#位於第一行開頭,並且是#!(稱為shebang)則例外,它表示該指令碼使用後面指定的直譯器/bin/sh解釋執行。如果把這個指令碼檔案加上可執行許可權然後執行:

$ chmod +x script.sh

$ ./script.sh

shell會fork乙個子程序並呼叫exec執行./script.sh這個程式,exec系統呼叫應該把子程序的**段替換成./script.sh程式的**段,並從它的_start開始執行。然而script.sh是個文字檔案,根本沒有**段和_start函式,怎麼辦呢?其實exec還有另外一種機制,如果要執行的是乙個文字檔案,並且第一行用shebang指定了直譯器,則用直譯器程式的**段替換當前程序,並且從直譯器的_start開始執行,而這個文字檔案被當作命令列引數傳給直譯器。因此,執行上述指令碼相當於執行程式

$ /bin/sh ./script.sh
以這種方式執行不需要script.sh檔案具有可執行許可權。再舉個例子,比如某個sed指令碼的檔名是script,它的開頭是

#! /bin/sed -f
執行./script相當於執行程式

$ /bin/sed -f ./script.sh
以上介紹了兩種執行shell指令碼的方法:

$ ./script.sh

$ sh ./script.sh

這兩種方法本質上是一樣的,執行上述指令碼的步驟為:

圖 31.1. shell指令碼的執行過程

互動shell(bashfork/exec乙個子shell(sh)用於執行指令碼,父程序bash等待子程序sh終止。

sh讀取指令碼中的cd ..命令,呼叫相應的函式執行內建命令,改變當前工作目錄為上一級目錄。

sh讀取指令碼中的ls命令,fork/exec這個程式,列出當前工作目錄下的檔案,sh等待ls終止。

ls終止後,sh繼續執行,讀到指令碼檔案末尾,sh終止。

sh終止後,bash繼續執行,列印提示符等待使用者輸入。

如果將命令列下輸入的命令用()括號括起來,那麼也會fork出乙個子shell執行小括號中的命令,一行中可以輸入由分號;隔開的多個命令,比如:

$ (cd ..;ls -l)
和上面兩種方法執行shell指令碼的效果是相同的,cd ..命令改變的是子shell的pwd,而不會影響到互動式shell。然而命令

$ cd ..;ls -l
則有不同的效果,cd ..命令是直接在互動式shell下執行的,改變互動式shell的pwd,然而這種方式相當於這樣執行shell指令碼:

$ source ./script.sh
或者

$ . ./script.sh
source或者.命令是shell的內建命令,這種方式也不會建立子shell,而是直接在互動式shell下逐行執行指令碼中的命令。

Shell指令碼和命令的執行方式

一 sheel指令碼的執行方式 bin sh filename filename 可能會有錯誤資訊提示未找到命令,原因可能是環境變數path沒有被設定為在當前目錄下查詢要執行的命令。3 在儲存指令碼程式的目錄中輸入 會建立子shell filename 4 source filename和.file...

shell的執行方式

首先我們了解最基礎的,輸出hello world!1.echo 輸出命令 root linux study echo 選項 輸出內容 選項 e 支援反斜線控制的字元轉換 root linux study echo hello word bash event not found 在shell中有特殊作...

js執行shell命令的幾種方式(Node)

在做乙個客戶端基建專案的時候,多處需要用到js調取命令列執行shell指令碼,這裡對shell命令 js執行shell命令做乙個簡單的介紹和總結。前言 一般在純前端靜態頁面的專案中,是不需要js調命令列操作的,通常在node專案,或者在electron客戶端專案中,可能會有這樣的需求。electro...