想寫這篇文章還得從執行乙個指令碼說起
nohup sh run.sh &
看到這樣執行指令碼的方式,剛開始有點不知所措,經過一番理解之後才發現這樣的執行方式考慮的真的很周全
用sh執行指令碼好處是不管指令碼有沒有執行許可權都可以被執行
【不管相對路徑./run.sh還是絕對路徑執行/home/sas/cmnew/adventnet/sas/bin/run.sh ,都需要執行許可權】
&符號表示將指令碼放到後台執行,但是如果關閉當前的終端的話,指令碼就會被終止
如果加上nohup再執行指令碼的話,即使終端被關閉,指令碼也會繼續在後台執行
所以nohup和&是雙保險
nohup sh run.sh & 就是為了安全並順利地執行指令碼
下面主要介紹執行shell指令碼的幾種方式
使用者在命令列輸入命令後,一般情況下shell會fork
並exec
該命令,但是shell的內建命令例外,執行內建命令相當於呼叫shell程序中的乙個函式,並不建立新的程序。以前學過的cd
、alias
、umask
、exit
等命令即是內建命令,凡是用which
命令查不到程式檔案所在位置的命令都是內建命令,內建命令沒有單獨的man手冊,要在man手冊中檢視內建命令,應該
$ man bash-builtins本節會介紹很多內建命令,如
export
、shift
、if
、eval
、[
、for
、while
等等。內建命令雖然不建立新的程序,但也會有exit status,通常也用0表示成功非零表示失敗,雖然內建命令不建立新的程序,但執行結束後也會有乙個狀態碼,也可以用特殊變數$?
讀出。
首先編寫乙個簡單的指令碼,儲存為script.sh
:
例 31.1. 簡單的shell指令碼
#! /bin/shshell指令碼中用cd ..
ls
#
表示注釋,相當於c語言的//
注釋。但如果#
位於第一行開頭,並且是#!
(稱為shebang)則例外,它表示該指令碼使用後面指定的直譯器/bin/sh
解釋執行。如果把這個指令碼檔案加上可執行許可權然後執行:
$ chmod +x script.shshell會$ ./script.sh
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(bash
)fork
/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...