linux下執(zhí)行shell命令方法簡介
linux下執(zhí)行shell命令有兩種方法
- 在當(dāng)前shell中執(zhí)行shell命令
- 在當(dāng)前shell中產(chǎn)生一個subshell,在subshell中執(zhí)行shell命令
1.在當(dāng)前shell中執(zhí)行shell命令
主要就是在命令行中通過交互方式方式直接輸入shell命令,命令行直接執(zhí)行給出結(jié)果.比如這樣:
2.在當(dāng)前shell中產(chǎn)生一個subshell,在subshell中執(zhí)行shell命令
比如我們把shell寫成shell腳本的方式來運(yùn)行,這個時候會先啟動一個subshell來代替當(dāng)前的shell,然后執(zhí)行shell腳本比如
#demo.sh #!/bin/bash read -p "please input your name:" name echo "hello $name"
添加執(zhí)行權(quán)限 chmod +x demo.sh
執(zhí)行如下
這個腳本功能很簡單,就是輸出一行話,提示用戶輸入自己的名字,然后腳本輸出hello xxx。我主要想說下執(zhí)行結(jié)果及其分析。先來一張圖:
首先我這邊是啟動了兩個shell,這個時候左右兩個shell的pid號分別是2473和2505,并且這兩個進(jìn)程都是從一個叫做進(jìn)程ID號為2465的進(jìn)程中fork出來的子進(jìn)程。
當(dāng)執(zhí)行了 ./demo.sh
之后,會看到有三個bash的進(jìn)程,進(jìn)程ID分別是2473、2505、2633.其中2473和2505的分別對應(yīng)之前的兩個shell的進(jìn)程ID。多出了一個pid為2633的進(jìn)程。這個進(jìn)程其實(shí)就是我們說的subshell??聪逻@個pid為2633的進(jìn)程的父進(jìn)程的進(jìn)程號是2473,就是說是從pid為2473的shell進(jìn)程中啟動一個subshell,subshell的進(jìn)程ID號為2633。當(dāng)我們輸入完warjiang,之后,腳本繼續(xù)執(zhí)行,執(zhí)行完畢之后,subshell進(jìn)程退出。
這個時候我們再去查看進(jìn)程的時候,就會發(fā)現(xiàn)少了pid為2633的進(jìn)程,也就是少了前面那個subshell。
講到這里,對于在當(dāng)前終端中執(zhí)行shell與在當(dāng)前終端中啟動subshell執(zhí)行shell兩種方式執(zhí)行shell也是有了一定程度的了解。下面將引出source命令與在終端中執(zhí)行shell腳本的區(qū)別。
source與bash的區(qū)別
嚴(yán)格的來說,我這個標(biāo)題有毒,因為source命令本來就是屬于bash中的一部分。我這里其實(shí)想說的是 source demo.sh
與 bash demo.sh
的區(qū)別。
相信大家但凡有l(wèi)inux下的開發(fā)、運(yùn)維經(jīng)驗的codeframer都會配置過什么jdk等等之類的環(huán)境變量,大家一定都會記得自己都執(zhí)行過 source ~/.bash.rc
,那么這個source到底是什么.先把這個問題放一放,我們先往下看.還是上面的那個demo.sh的腳本.下面我們來比較一下 bash demo.sh(或者先執(zhí)行chmod +x demo.sh 再執(zhí)行./demo.sh)
與 source demo.sh
的區(qū)別。
其中靠上面的一張圖片是執(zhí)行 ./demo.sh
的截圖,靠下面的一張是 source demo.sh
。比較兩張圖片,顯然,兩張圖片最大的區(qū)別在于,上面一張圖片多了一個subshell也就是pid為2633進(jìn)程的出現(xiàn)再消失的過程。所以如果執(zhí)行執(zhí)行shell腳本,當(dāng)前命令行會自動產(chǎn)生一個子進(jìn)程,當(dāng)執(zhí)行完腳本之后,會自動把這個子進(jìn)程關(guān)閉。但是souce命令不會產(chǎn)生新的子進(jìn)程,而是在當(dāng)前終端進(jìn)程中讀取并執(zhí)行shell腳本。
所以 source與bash的最大區(qū)別在于source不用啟動新的shell,而bash需要啟動新的shell
再回到上面那個 source ~/.bashrc
,其實(shí)相當(dāng)于在當(dāng)前的終端中執(zhí)行 ~/.bashrc
,而.bashrc文件中的內(nèi)容就是中關(guān)于export PATH部分的語句,也就是設(shè)置PATH變量,執(zhí)行 source ~/.bashrc
讓配置的新的環(huán)境變量PATH在當(dāng)前終端中生效.
source與(.)
這邊的話,~/.bash_aliases一般用過alias的持久化,記錄用戶的alias記錄。直觀上來看,執(zhí)行 . ~/.bash_aliases
應(yīng)該是設(shè)置一些aliases中的變量別名。那么這個 .
是什么.其實(shí)這里的 .
與 source
的作用是一樣,表示在當(dāng)前的終端中執(zhí)行腳本,這樣就可以讓當(dāng)前的終端共享aliases中的alias配置信息
相關(guān)文章
Linux?Shell腳本多命令執(zhí)行邏輯的示例詳解
Linux?中可以使用分號";“、雙and號”&&“和雙豎線”||"來連接多個命令。根據(jù)場景的不同適當(dāng)?shù)氖褂煤线m的符號,感興趣的小伙伴可以了解一下2022-10-10shell在指定目錄下批量執(zhí)行sql腳本的實(shí)例
今天小編就為大家分享一篇shell在指定目錄下批量執(zhí)行sql腳本的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06shell 提取文件名和目錄名的方法實(shí)現(xiàn)
本文主要介紹了shell 提取文件名和目錄名的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02shell腳本中一鍵部署zookeeper集群服務(wù)的方法
Zookeeper是一個開源的分布式的,為分布式框架提供協(xié)調(diào)服務(wù)的Apache項目,這篇文章主要介紹了shell腳本一鍵部署zookeeper集群服務(wù)的方法,需要的朋友可以參考下2022-05-05