linux創建文件命令,(035) Linux之其他命令

 2023-11-07 阅读 23 评论 0

摘要:十年運維系列之基礎篇 - Linux 作者:曾林? 聯系:1494445739@qq.com 網站:www.jplatformx.com 版權:文章未經同意請勿轉載 一、引言 linux創建文件命令。  本小節中將談論一些比較瑣碎零散的知識。這些知識雖然不太經常使用,但是卻對

十年運維系列之基礎篇 - Linux

作者:曾林?

聯系:1494445739@qq.com

網站:www.jplatformx.com

版權:文章未經同意請勿轉載


一、引言

linux創建文件命令。  本小節中將談論一些比較瑣碎零散的知識。這些知識雖然不太經常使用,但是卻對特定的程序設計問題大有幫助。下面將學習這方面的內容。

?

二、組命令和子shell

  bash允許將命令組合到一起使用,這有兩種方式,一種是利用組命令,另一種是使用子shell。下面是這兩種方式的語法實例。

  組命令:

{ command1; command2; [command3;...] }

  子shell:

(command1; command2; [command3;...])

  這兩種形式的區別在于,組命令使用花括號將其命令括起來,而子shell則用圓括號。指的注意的是,在bash實現組命令時,必須使用一個空格將花括號與命令分開,并且在閉合花括號前使用分號或是換行來結束最后的命令。執行結果如下圖所示:

linux top命令、

?

1. 執行重定向

  組命令和子shell有什么用途呢?它們都可以用于管理重定向。下面讓我們看一個在多個命令中執行重定向的腳本段。

1 ls -al > output.txt
2 echo "Listing of foo.txt" >> output.txt
3 cat foo.txt >> output.txt

  顯而易見,3條命令將輸出重定向為output.txt文件。使用組命令,可以按照如下的方式編碼。

{ ls -l; echo "Listing of foo.txt"; cat foo.txt; } > output.txt
(ls -l; echo "Listing of foo.txt"; cat foo.txt;) > output.txt

  使用這個技術,可以減少一些輸入,但是組命令或子shell真正有價值的地方在于管道的使用。當創建命令管道時,通常將多條命令的結果輸出到一條流中,這很有用。組命令和子shell使得這一點變得簡單。

?

2. 進程替換

刪除命令linux,  雖然組命令和子shell看起來相似,都可以用來為重定向整合流,但是,它們有一處主要的不同。子shell(正如名字所示)在當前shell的子拷貝中執行命令,而組命令在當前shell里執行所有命令。這意味著子shell復制當前的環境變量以創建一個新的shell實例。當子shell退出時,復制的環境變量也就消失了,因此,任何對子shell的環境(包括變量賦值)的改變也同樣丟失了。所以,大多數情況下,除非腳本需要子shell,否則組命令比子shell更可取。組命令更快,并且需要更少的內存。

  在前面其實我們已經接觸到了子shell環境存在問題的一個實例,管道中的read命令沒有像先前預期的那樣工作。我們可以采用如下的方式重建管道。

echo "foo" | read
echo $REPLY

  REPLY變量的內容總是為空,因為read命令是在子shell中執行的,并且當子shell終止的時候,REPLY的拷貝也遭到了破壞。

  由于總是在子shell中執行管道中的命令,任何變量賦值的命令都會遇到這個問題。很幸運地是,shell提供了一種叫做進程替換的外部擴展方式來解決這個問題。

  實現進程替換有兩種方式,一種是產生標準輸出的進程,如下所示:

<(list)

  另一種是吸納標準輸入的進程,如下所示:

>(list)

shell基本命令的使用、  這里的list是一系列的命令。

  為了解決上述read命令的問題,我們可以像這樣使用進程替換。

read < <(echo "foo")
echo $REPLY

  進程替換允許將子shell的輸出當做一個普通的文件,目的是為了重定向。事實上,這是一種擴展形式,我們可以查看它的真實值。

  通過使用echo來查看擴展結果,可以看到文件/dev/fd/63正為子shell提供輸出。

?

三、trap

shell腳本執行命令。  在以前的章節中我們了解了程序如何響應信號。同樣我們也可以將這種功能應用到腳本中。雖然到目前為止,我們所寫的腳本還不需要這種功能(因為它們有著更短的執行時間,并且不產生臨時文件),但是,擁有一個信號處理程序可能對龐大復雜的腳本大有裨益。

  當設計一個龐大復雜的腳本時,我們一定要考慮到,如果在腳本正在運行時,用戶注銷或是關閉電腦時會發生什么情況。當這樣的情況發生時,將會把信號發送到所有受影響的進程。相應地,執行那些進程的程序能夠通過一些操作來保證程序合理有序的結束。設想一下,比如說,腳本在執行的時候創建了一個臨時文件。在一個好的設計中,當腳本結束工作時,該臨時文件會自動刪除。如果接收的信號表明將要過早的結束程序,這個時候讓腳本刪除這個文件也是很明智的。

  為了實現這個目的,bash提供了一種trap機制。內置命令trap可以恰如其分地實現trap機制。trap命令使用的語法如下:

trap argument signal [signal...]

  這里的argument是作為命令被讀取的字符串,而signal是對信號量的說明,該信號量將會觸發解釋命令的執行。下面是一個簡單的例子:

 1 #!/bin/bash
 2 
 3 #trap-demo: simple signal handling demo
 4 
 5 trap "echo 'I am ignoring you.'" SIGINT SIGTERM
 6 
 7 for i in {1..5}; do
 8     echo "Iteration $i of 5"
 9     sleep 5
10 done

  每當運行中的腳本接受到SIGINT或者SIGTERM信號時,腳本定義的trap將執行echo命令。當用戶通過按下ctrl+c鍵來試圖結束腳本時,程序的執行情況如下。

linux移動文件命令。  可以看出,每次用戶試圖中斷程序時,都會輸出這樣的信息。

  構造一個字符串來形成一系列有用的命令看起來很笨拙,因此,通常的做法是指定shell函數來代替命令。在下面的例子中,我們為每個將要處理的信號指定一個獨立的shell函數。代碼如下:

 1 #!/bin/bash
 2 
 3 # foo.sh: simple signal handling demo
 4 
 5 exit_on_signal_SIGINT()    {
 6     echo "Script interrupted." 2>&1
 7     exit 0
 8 }
 9 
10 exit_on_signal_SIGTERM()    {
11     echo "Script terminated."  2>&1
12     exit 0
13 }
14 
15 trap exit_on_signal_SIGINT SIGINT
16 trap exit_on_signal_SIGTERM SIGTERM
17 
18 for i in {1..5}; do
19     echo "Iteration $i of 5"
20     sleep 5
21 done

  這個腳本為兩個不同的信號定義了相應的trap命令。當接收到特定信號的時候,每個trap相應地執行指定的shell函數。注意到每個信號處理函數中的exit命令。如果沒有exit命令,腳本會循環執行該函數。

?

四、異步執行

  有的時候我們希望執行多項任務。眾所周知,所有現代的操作系統即便不是多用戶系統,至少也是多任務系統。腳本可以在多任務中運行。

  這涉及到父腳本以及一個或多個子腳本的加載問題,子腳本可以在父腳本運行時執行其他額外的任務。但是,當一系列腳本以這種方式運行的時候,保持父腳本與子腳本的協調一致就會是一個問題。也就是說,試想這樣一種情況,如果父腳本與子腳本彼此依賴,一個腳本必須等待另一個腳本任務完成之后才能繼續完成自己的任務。

linux基礎命令?  bash提供了一個內置的命令來幫助管理異步執行。wait命令可以讓父腳本暫停,直到指定的進程(比如子腳本)結束。

?

1. wait命令

  首先我們來演示wait命令。為此我們需要兩個腳本來完成這個過程。下面首先是一個父腳本:

 1 #!/bin/bash
 2 
 3 # async-parent: Asynchronous execution demo(parent)
 4 
 5 echo "Parent: starting..."
 6 echo "Parent: launching child script..."
 7 async-child.sh &
 8 pid=$!
 9 echo "Parent: child (PID=$pid) launched..."
10 
11 echo "Parent: continuing..."
12 sleep 2
13 
14 echo "Parent: pausing to wait for child to finish..."
15 wait $pid
16 
17 echo "Parent: child is finished. Continuing..."
18 echo "Parent: parent is done. Exiting..."

  下面是子腳本:

1 #!/bin/bash
2 
3 # async-child: Asynchronous execution demo (child)
4 
5 echo "Child: child is running..."
6 sleep 5
7 echo "Child: child is done. Exiting..."

  在這個例子中,我們可以看出子腳本內容非常簡單,父腳本執行實際的操作。在父腳本中,子腳本加載并在后臺運行。通過將$! shell程序參數值賦值給pid變量來記錄子腳本的進程ID,該參數值總是包含后臺中最后一次運行的進程ID。

  父腳本繼續執行,隨后執行帶有子進程PID的wait命令。這會導致父腳本暫停,直到子腳本退出;子腳本退出后,父腳本也結束。

linux基本命令的使用、?

五、命名管道

  大多數類UNIX系統支持創建一個叫做命名管道的特殊類型的文件。使用命名管道可以建立兩個進程之間的通信,并且可以像其他類型的文件一樣使用。雖然它們沒有其他類型的文件那么受歡迎,但是它們仍然值得了解。

  客戶端/服務器模式是一種常見的程序設計結構。它可以使用命名管道這樣的通信方式,也可以使用網絡連接這樣的進程間通信方式。

  使用客戶端/服務器程序設計架構最為廣泛的地方當然是Web服務器與Web瀏覽器之間的通信。Web瀏覽器充當客戶機,客戶機對服務器提出請求,服務器通過網頁的形式對瀏覽器做出回應。

  命名管道的工作方式與文件雷同,但實際上是兩塊先進先出(FIFO)的緩沖區。與普通的(未命名的)管道一樣,數據從一端進入,從另一端出來。使用命名管道,也可以以如下方式設置。

process1 > named_pipe 以及 process2 < named_pipe

  以上的執行效果等效于如下語句:

process1 | process2

使用shell命令??

1. 設置命名管道

  首先,我們必須創建一個命名管道。使用mkfifo命令即可完成。如下所示:

?  這里使用mkfifo命令創建一個名為pipe1的命名管道。使用ls命令查看文件屬性,可以看到屬性字段的第一個字母是p,這表明它是一個命名管道。

?

2. 使用命名管道?

  為了說明命名管道是如何工作的,我們需要兩個終端窗口(或者兩個虛擬的控制臺)。在第一個終端中,我們輸入一條簡單的命令,并將其輸出重新定位到這個命名管道,如下所示:?

linux打開文件命令。?  當按下enter鍵之后,這個命令看起來像是掛起來了。這是因為從管道的另一端還沒有接收到數據。當這種情況發生時,也就是說命名管道被堵塞。一旦將一個進程連接到管道的另一端,情況就會有所改變,進程會從管道中讀取數據。使用第二種終端窗口,輸入如下命令:

cat < pipe1

  第一個終端窗口產生的目錄列表作為cat命令的輸出出現在第二個終端窗口。一旦它不處于阻塞狀態,第一個終端窗口中的ls命令就可以成功完成。

?

轉載于:https://www.cnblogs.com/jplatformx/p/4362186.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/167967.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息