新聞中心
在現(xiàn)代計算機系統(tǒng)中,多進程運行很常見。進程間通信是保證多進程協(xié)作的重要手段。在Linux系統(tǒng)上,進程間通信的方式有很多,其中shell管道通信是一種簡單高效的方式。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設計制作、網(wǎng)站制作與策劃設計,梅縣網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設10余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:梅縣等地區(qū)。梅縣做網(wǎng)站價格咨詢:13518219792
Shell管道通信是指在shell環(huán)境下通過管道符將一個進程的輸出連接到另一個進程的輸入的方法。在這種方式下,進程A將輸出傳遞給進程B,這樣就可以實現(xiàn)進程間通信,并達到進程協(xié)作的目的。下面通過幾個具體的例子來詳細介紹shell管道通信在Linux系統(tǒng)上如何高效實現(xiàn)進程間通信。
一、通過管道實現(xiàn)進程間通信
假如我們有兩個進程,分別是進程A和進程B,需要進行數(shù)據(jù)的傳遞。進程A需要將數(shù)據(jù)輸出,進程B需要將輸入連接到進程A的輸出。通過管道符可以很方便地實現(xiàn)進程間通信。具體實現(xiàn)步驟如下:
1.進程A向管道輸出數(shù)據(jù),例如:
“`
echo “data to be sent” | pipe
“`
這里,`data to be sent`是進程A輸出的數(shù)據(jù),`pipe`是管道符號,表示這個進程需要將數(shù)據(jù)傳遞給下一個進程。
2.進程B將管道當作輸入依賴,例如:
“`
pipe | process B
“`
這里,管道符前面的`pipe`表示數(shù)據(jù)來源,管道符后面的`process B`表示數(shù)據(jù)目的地。
通過上述兩個例子我們可以看到,使用shell管道實現(xiàn)進程間通信非常容易。其中,除了管道符號外,無需進行其他操作。
二、通過管道批量傳輸數(shù)據(jù)
在上面的例子中,我們只演示了單個數(shù)據(jù)的傳輸,但對于大量數(shù)據(jù)傳輸時,單個數(shù)據(jù)的傳輸效率是不高的。因此,我們需要通過一定方式批量傳輸數(shù)據(jù),提高傳輸效率。下面的例子中演示了如何使用管道批量傳輸數(shù)據(jù)。
1.進程A輸出大量數(shù)據(jù),例如:
“`
more data.txt | pipe
“`
其中,`data.txt`是需要傳輸?shù)奈募?/p>
2.進程B讀取并處理管道數(shù)據(jù),例如:
“`
pipe | process B
“`
在這個例子中,進程A通過more命令將需要傳輸?shù)臄?shù)據(jù)輸出到管道中,進程B通過管道符號接收數(shù)據(jù),并進行處理。這種方式可以有效的批量傳輸數(shù)據(jù),提高數(shù)據(jù)傳輸?shù)男省?/p>
三、通過同時執(zhí)行多個進程實現(xiàn)并行處理
在一些場景下,我們需要同時執(zhí)行多個進程,每個進程接收來自其他進程的數(shù)據(jù)并進行數(shù)據(jù)處理,這種方式可以實現(xiàn)數(shù)據(jù)處理的并行處理,提高整個系統(tǒng)的執(zhí)行效率。下面通過一個實例來詳細說明這個過程。
1.定義若干個進程:
“`
process A | pipe1
process B | pipe2
process C | pipe3
process D | pipe4
“`
在這個實例中,我們定義了四個進程A、B、C和D,每個進程產(chǎn)生的數(shù)據(jù)都通過一個獨立的管道(pipe)進行傳輸,管道的名稱分別是pipe1、pipe2、pipe3和pipe4。
2.將所有管道匯聚起來:
“`
cat pipe1 pipe2 pipe3 pipe4 | process E
“`
在這個步驟中,我們將四個管道中的數(shù)據(jù)合并在一起,然后傳輸給另一個進程E進行處理。
通過上述實例,我們可以看到,使用shell管道實現(xiàn)進程間通信可以同時執(zhí)行多個進程并進行并行處理,大大提高了整個處理系統(tǒng)的效率。
四、使用Shell腳本實現(xiàn)數(shù)據(jù)傳輸
Shell腳本是Linux系統(tǒng)下主要的腳本語言之一,可以用于自動化操作、快速處理數(shù)據(jù)等。在數(shù)據(jù)傳輸?shù)膱鼍爸?,使用腳本可以自動化實現(xiàn)數(shù)據(jù)的輸入輸出,方便快捷。
下面通過實例演示如何使用Shell腳本實現(xiàn)數(shù)據(jù)傳輸。
1.編寫腳本:
“`
#!/bin/bash
# A腳本
for i in {1..10}
do
echo “$i”
done | pipe
“`
其中,`A.sh`腳本包含了一個循環(huán),逐個輸出1到10之間的數(shù)字,并將每個數(shù)字通過pipe符輸出到管道中。
“`
#!/bin/bash
# B腳本
pipe | while read data
do
echo “Processing data $data …”
done
“`
在這個腳本中,我們使用while循環(huán)接收管道數(shù)據(jù),并對每個數(shù)據(jù)進行處理。這個腳本可以作為進程B在進程A運行時,接收管道數(shù)據(jù)并進行處理。通過上述Shell腳本的編寫,我們可以實現(xiàn)自動化的數(shù)據(jù)傳輸,大大提高數(shù)據(jù)處理的效率。
通過shell管道通信可以實現(xiàn)Linux進程間通信的高效實現(xiàn)。使用這種方式,我們可以方便、快捷地實現(xiàn)進程數(shù)據(jù)的傳輸和并行處理,提高整個系統(tǒng)的處理效率。如果你還沒有接觸過shell管道通信方式,不妨在Linux系統(tǒng)中開啟一個終端窗口,嘗試一下上述例子,掌握這種數(shù)據(jù)傳輸方式的實現(xiàn)方法。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導10多年以來專注數(shù)字化網(wǎng)站建設,提供企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,響應式網(wǎng)站制作,設計師量身打造品牌風格,熱線:028-86922220學生信的那些事兒之七 – Linux基礎之Shell腳本編程
沿著前面的軌跡,接下來是Linux中shell腳本的學習。這對于生信工程師后續(xù)處理大量 (海量更合適些) 數(shù)據(jù)是非常非常脊碼重要的,但是同樣的,作為一個有點古板的人,對于”腳本”是什么意思我都死磕了好久。主要覺得有些抽象,尤其是跟生信的同事討論項目分析部分的問題時,他們經(jīng)常會說道這個詞,在他們意識里這是個不言自明的術語,殊不知對外行人而言 (比如我),那簡直就是無情的”知識的詛咒”。經(jīng)常是我假裝聽懂了,然后繼續(xù)討論下面的問題,形成一個模糊的印象。
百度上的解釋是:腳本(Script)是一種批處理文件的延伸,是一種純文本保存的程序,一般來說的計算機腳本程序是確定的一系列控制計算機進行運算操作動作的組合,在其中可以實現(xiàn)一定的邏輯分支等。不知道你能不能看懂,反正我開始的時候真是一知半解。
鳥哥私房菜的解釋是:shell script是利用 shell 的功能所寫的一個”程序”,這個程序是使用純文本文件,將一些shell的語法與命令(含外部命令)寫在里面,搭配正則表達式、管道命令與數(shù)據(jù)流重定向等功能,以達到我們所想要的處理的目的。不明覺厲,好像更看不懂了···
Jude 的簡單粗暴大白話解釋是:腳本就是Linux中很多命令按照一定規(guī)則的組合,以實現(xiàn)某個特定的功能。Linux中有很多簡單的命令,往往只是進行了簡單的對話,比如 cd 就是進入到某個目錄,簡單直接。但是如果我想進入某個目錄A,然后在目錄A中創(chuàng)建目錄B,再在目錄B中創(chuàng)建文本C呢?當然可以一步一步操作,如果想要一步到位呢,那就可以用腳本,把三個命令寫在一起,一起執(zhí)行。好像有點啰嗦···
或者從英語的角度去理解,腳本的對應英文是Script,而這個單詞的中文釋義中還有劇本的意思。劇本就好理解了啊,劇本就是導演(生信工程師)基于某個主旨(要實現(xiàn)的目標)按照一定的手法(規(guī)則)所寫的一個故事。不管是哪個演員,都得按照劇本演。所以,學好英語對于生信也是有幫助的~
按照腳本的復雜程度可以分為:
這個無需多說,其實就是若干個簡單命令的順序排列,執(zhí)行腳本后會按照命令的前后關系從前往后一一執(zhí)行。
相對于簡單的基本腳本,結構化的命令腳本可以施加邏輯流程控制,從而改變程序(命令)執(zhí)行的順序?;灸_本中的命令就是從上往下執(zhí)行,但兄野迅是結構化的命令腳本可以根據(jù)邏輯判斷重復或者跳過某些命令。
常用的結構化命令(語句)有:
后面還有什么嵌套循環(huán)啊啥的,不過我覺得上面的7中命令學到家了,應該可以應付大部分在生信分析里面的應用了。
記得高中的時候,物理老師(也是班主任)在給我們講解習題時有個有意思的套路:不管什么難題現(xiàn)在下面寫個”答:”,以示自己解決問題的決心,也是一種正向的心理暗示。腳本編寫也是有套路的,不過總的來說還是比較簡單。
對于簡單的腳本(超級簡單的那種),直接幾個命令連在一起即可,中間用”;”隔開。
對于更長更復雜的腳本,一般需要創(chuàng)建一個文本,并在里面編輯。這就涉及到了文本編輯器,比較常用和簡單的一般有nano和vim,實在羨此很簡單,規(guī)則也容易理解,教程隨手可得,不多說。
比如用vim創(chuàng)建了一個腳本之后,具體的語法(套路):
ok,腳本寫完了,怎么讓腳本開始工作呢?這有涉及到之前講過的環(huán)境變量和相對路徑、絕對路徑了。方法有三:
就這么多吧,應該有點感覺到了,剩下的就是狂練狂練了~
如何使用Linux shell編程來進行系統(tǒng)管理和網(wǎng)絡管理
從程序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用 Shell腳本編程,完成更加復雜的操作。在Linux GUI日益完善的今天,在系統(tǒng)管理等領域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個Linux用戶的必修 功課之一。
Linux的Shell種類眾多,常見的有:Bourne Shell(/usr/bin/sh或/bin/弊明sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/in/sh),等等。不同的Shell語言的語法有所不同,所以不能交換使用。卜皮每種Shell都有其特色之處,基本上,掌握其中任何一種 就足夠了。在本文中,我們關注的重點是Bash,也就是Bourne Again Shell,由于易用和免費,Bash在日常工作中被廣泛使用;同時,Bash也是大多數(shù)Linux系統(tǒng)默認的Shell。在一般情況下,人們并不區(qū)分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。
利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
首行中的符號#!告訴系統(tǒng)其后路徑所指定的程序即是解釋此腳本文件的Shell程 序。如果首行沒有這句話,在執(zhí)行腳本文件的時候,將會出現(xiàn)錯誤。后續(xù)的部分就是主程序,Shell腳本像高級語言一樣,也有變量賦值,也有控制語句。除第 一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上”,這個符號表明下一行與此行會合并為同一行。
編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個Bash腳本文件。執(zhí)行腳本的時候,要先將腳本文件的屬性改為可執(zhí)行的:
chmod +x filename.sh
執(zhí)行腳本的方法是:
./filename.sh
下面我們從經(jīng)典的“hello world”入手,看一看最簡單的Shell腳本的模樣。
#!/bin/sh
#print hello world in the console window
a = “hello world”
echo $a
Shell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數(shù)據(jù)區(qū)分配內存進行存儲,這個變量歸當前的Shell所有,任何子進 程都不能訪問本地變量。這些變量與環(huán)境變量不同,環(huán)境變量被存儲在另一內存區(qū),叫做用戶環(huán)境區(qū),這塊內存中的變量可以被子進程訪問。變量賦值的方式是:
variable_name = variable_value
如果對一個已經(jīng)有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加$,$variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現(xiàn)混淆租弊告的情況,可以使用花括號來區(qū)分,例如:
echo “Hi, $as”
就不會輸出“Hi, hello worlds”,而是輸出“Hi,”。這是因為Shell把$as當成一個變量,而$as未被賦值,其值為空。正確的方法是:
echo “Hi, ${a}s”
單引號中的變量不會進行變量替換操作。
關于變量,還需要知道幾個與其相關的Linux命令。
env用于顯示用戶環(huán)境區(qū)中的變量及其取值;set用于顯示本地數(shù)據(jù)區(qū)和用戶環(huán)境區(qū)中的變量及其取值;unset用于刪除指定變量當前的取值,該值將被指定為NULL;export命令用于將本地數(shù)據(jù)區(qū)中的變量轉移到用戶環(huán)境區(qū)。
下面我們來看一個更復雜的例子,結合這個例子,我們來講述Shell Script的語法。
1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if ; then
4 cat
ren — renames a number of files using sed regular expressions
6
USAGE: ren ‘regexp’ ‘replacement’ files
EXAMPLE: rename all *.HTM files in *.html:
ren ‘HTM$’ ‘html’ *.HTM
10
11 HELP
exit 0
13 fi
14 OLD=”$1″
15 NEW=”$2″
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if ; then
newfile=`echo “$file” | sed “s/${OLD}/${NEW}/g”`
if ; then
echo “ERROR: $newfile exists already”
else
echo “renaming $file to $newfile “
mv “$file” “$newfile”
fi
30 fi
31 done
我們從頭來看,前面兩行上一個例子中已經(jīng)解釋過了,從第三行開始,有新的內容。if語句和其他編程語言相似,都是流程控制語句。它的語法是:
if …; then
…
elif …; then
…
else
…
fi
與其他語言不同,Shell Script中if語句的條件部分要以分號來分隔。第三行中的表示條件測試,常用的條件測試有下面幾種:
判斷$file是否是一個文件
判斷$a的值是否小于3,同樣-gt和-le分別表示大于或小于等于
判斷$file是否存在且有可執(zhí)行權限,同樣-r測試文件可讀性
判斷變量$a是否有值,測試空串用-z
判斷$a和$b的取值是否相等
判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立
要注意條件測試部分中的空格。在方括號的兩側都有空格,在-f、-lt、=等符號兩側同樣也有空格。如果沒有這些空格,Shell解釋腳本的時候就會出錯。
$#表示包括$0在內的命令行參數(shù)的個數(shù)。在Shell中,腳本名稱本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整個參數(shù)列表,不包括$0,也就是說不包括文件名的參數(shù)列表。
現(xiàn)在我們明白第三行的含義是如果腳本文件的參數(shù)少于三個,則執(zhí)行if和fi語句之間 的內容。然后,從第四行到第十一行之間的內容在Shell Script編程中被稱為Here文檔,Here文檔用于將多行文本傳遞給某一命令。Here文檔的格式是以
第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來說,熟練使用Linux命令也可以大大減少Shell腳本的長度。
十四、十五兩句是賦值語句,分別將之一和第二參數(shù)賦值給變量OLD和NEW。緊接下來的兩句是注釋,注釋下面的兩條shift的作用是將參數(shù)列表中的之一個和第二個參數(shù)刪除,后面的參數(shù)依次變?yōu)樾碌闹缓偷诙?shù),注意參數(shù)列表原本也不包括$0。
然后,自二十一行到三十一行是一個循環(huán)語句。Shell Script中的循環(huán)有下面幾種格式:
while && { || } …; do
…
done
for var in …; do
…
done
for (( cond1; cond2; cond3 )) do
…
done
until && { || } …; do
…
done
在上面這些循環(huán)中,也可以使用類似C語言中的break和continue語句中斷 當前的循環(huán)操作。第二十一行的循環(huán)是將參數(shù)列表中的參數(shù)一個一個地放入變量file中。然后進入循環(huán),判斷file是否為一個文件,如果是文件的話,則用 sed命令搜索和生成新的文件名。sed基本上可以看成一個查找替換程序,從標準輸入,例如管道讀入文本,并將結果輸出到標準輸出,sed使用正則表達式 進行搜索。在第二十三行中,backtick(`)的作用是取出兩個backtick之間的命令輸出結果,在這里,也就是將結果取出賦給變量 newfile。此后,判斷newfile是否已經(jīng)存在,否則就把file改成newfile。這樣我們就明白這個腳本的作用了,Shell Script編寫的其他腳本與此相似,只不過是語法和用法稍有不同而已。
通過這個例子我們明白了Shell Script的編寫規(guī)則,但還有幾件事情需要講述一下。
之一個,除了if語句之外,Shell Script中也有類似C語言中多分支結構的case語句,它的語法是:
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac
我們再就下面一個例子,看看case語句的用法。
while getopts vc: OPTION
do
case $OPTION in
c) COPIES=$OPTARG
ehco “$COPIES”;;
v) echo “suyang”;;
\?) exit 1;;
esac
done
上面的getopts類似于C語言提供的函數(shù)getopts,在Shell Script中,getopts經(jīng)常和while語句聯(lián)合起來使用。getopts的語法如下:
getopts option_string variable
option_string中包含一串單字符選項,若getopts在命令行參數(shù)中 發(fā)現(xiàn)了連字符,那么它會將連字符之后的字符與option_string進行比較,若匹配成功,則把變量variable的值設為該選項,若無匹配,則把 變量的值設為?。有時候,選項還會帶一個值,例如-c5等,這時要在option_string中該選項字母后面加上一個冒號,getopts發(fā)現(xiàn)冒號 后,會讀取該值,然后將該值放入特殊變量OPTARG中。這個命令比較復雜,如有需要,讀者可以詳細參閱Shell編寫的相關資料。
上面這個循環(huán)的作用就是依次取出腳本名稱后面的選項,進行處理,如果輸入了非法選項,則進入”?指定的部分,退出腳本程序。
第二個,Bash提供了一種用于交互式應用的擴展select,用戶可以從一組不同的值中進行選擇。其語法如下:
select var in …; do
break;
done
例如,下面這段程序的輸出是:
#!/bin/bash
echo “Your choice?”
select var in “a” “b” “c”; do
break
done
echo $var
Your choice?
1) a
2) b
3) c
第三,Shell Script中也可以使用自定義的函數(shù),其語法形式如下:
functionname()
{
…
}
例如我們可以把上面第二個例子中第四到第十二行放入一個名為help函數(shù)體內,以后每次調用的時候直接寫help即可。函數(shù)中處理函數(shù)調用參數(shù)的方法是,直接用上面講過的$1、$2來分別表示之一、第二個參數(shù),用$*表示參數(shù)列表。
第四,我們也可以在Shell下調試Shell Script腳本,當然最簡單的方法就是用echo輸出查看變量取值了。Bash也提供了真正的調試方法,就是執(zhí)行腳本的時候用-x參數(shù)。
sh ?x filename.sh
這會執(zhí)行腳本并顯示腳本中所有變量的取值,也可以使用參數(shù)-n,它并不執(zhí)行腳本,只是返回所有的語法錯誤。
關于linux shell 管道通信的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都網(wǎng)站建設選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設計,高端小程序APP定制開發(fā),成都網(wǎng)絡營銷推廣等一站式服務。
網(wǎng)站欄目:LinuxShell管道通信:高效實現(xiàn)進程間通信(linuxshell管道通信)
URL地址:http://fisionsoft.com.cn/article/ccoeshi.html


咨詢
建站咨詢
