shell 從標準輸入或腳本中讀取的每一行稱為管道,它包含了一個或多個命令,這些命令被一個或多個管道字符(|)隔開.
事實上嗨喲很多特殊符號可用來分割單個的命令:分號(;),管道(|),&,邏輯 AND(&&),邏輯 OR(||).對于每一個地區(qū)的管道,shell 都會將命令分割,為管道設(shè)置 I/O,并且對每一個命令依次執(zhí)行下面的操作.
看起來很復(fù)雜,但是每一個步驟都是在 shell 的內(nèi)存里發(fā)生的,shell 不會真的把每個步驟的發(fā)生演示給我們看.所以這是我們分析 shell 內(nèi)存的情況,從而知道每個階段的命令行是如何被轉(zhuǎn)換的.
案例:
mkdir /tmp/x #建立臨時性目錄
cd /tmp/x #切換到該目錄
touch f1 f2 #建立文件
f=f y=”a b” #賦值兩個變量
echo ~+/${f}[12] $y $(echo cmd subst) $((3+2))>out #忙碌的命令
上述命令的執(zhí)行步驟:
最后的結(jié)果:
$cat out
/tmp/x/f1 /tmp/x/f2 a b cmd subst 5
eval 語句
shell 中的 eval 這個命令很神奇,他能把字符串當做命令來執(zhí)行.PS:這個字符串必須是可執(zhí)行的 bash 命令才可以.
案例:
eval “l(fā)s” #輸出當前目錄的所有文件
語法: eval [參數(shù)]
補充說明:eval 可讀取一連串的參數(shù),然后再依慘呼本身的特性來執(zhí)行.
參數(shù):不限數(shù)目,彼此之間用分號隔開.
案例:我有一個文件test.txt
命令:cat test.txt
輸出:hello world
命令:myfile="cat test.txt"
命令:echo $myfile
輸出:cat test.txt
命令:eval $myfile
輸出:hello world
從eval $myfile
這條命令可以看出,eval 進行了變量替換,將字符串中屬于 bash 的命令執(zhí)行了.
把拼接起來的字符串當作命令執(zhí)行,這就是 eval 的神奇之處.
subShell 與代碼塊
subShell 是一群被括在圓括號里的命令,這些命令會在另外的進程中執(zhí)行.當你需要讓一小組的命令在不同的目錄下執(zhí)行時,這種方式可以讓你不必修改主腳本的目錄,直接處理這種情況.
例如:tar -cf -.| (cd /tmp;tar -xpf -)
左邊的 tar 命令會產(chǎn)生當前目錄的 tar 打包文件,將他傳送給標準輸出.這份打包文件會通過管道傳遞給走遍的 subShell 里的命令.開頭的 cd 命令會先切換到新目錄,也就是讓大寶文件在此目錄下解開.然后,走遍的 tar 將從打包文件中解開文件.注意,執(zhí)行此管道的 shell(或腳本)并未更改他的目錄.
代碼塊概念上與 subShell 雷同,只不過他不會建立新的進程.代碼塊里的命令以花括號({})括起來,且對主腳本的狀態(tài)會造成影響(例如他的當前目錄).一般來說,花括號被視為 shell 關(guān)鍵字,意即他們只有出現(xiàn)在命令的第一個符號時會被識別.實際上:這表示你必須將結(jié)束花括號放置在換行字符或分號之后.例如:
cd /home/directory||{
echo could not change to /home/directory!>&2
echo you lose !>&2
exit1
}
I O重定向也可以套用 subShell 與代碼塊里.在該情況下,所有的命令會從重定向來源讀取它們的輸入或傳送他們的輸出.
??????????????????subShell與代碼塊 |
|||
結(jié)構(gòu) |
定界符 |
認可的位置 |
另外的進程 |
SubShell |
() |
行上的任何位置 |
是 |
代碼塊 |
{} |
在換行字符,分號或關(guān)鍵字之后 |
否 |
注意:代碼塊里的 exit 會終止整個腳本.
我們通常在 shell 中運行一個腳本只需要簡單的調(diào)用./[script_name]即可,這種方式下,shell 會啟動一個子進程來運行該腳本,稱為 subShell,當 subShell 運行完成,子進程結(jié)束.父進程的環(huán)境不會有任何改變.
案例:bash 代碼
#!/bin/bash
cd /var/cache
testname="fine"
分別在 shell 中運行
用 source 命令來運行腳本,不會產(chǎn)生子進程,腳本在 shell 的進程空間中執(zhí)行,所以運行重定義的變量,執(zhí)行的操作,都會在 shell 的運行環(huán)境中保留下來.