1. 程式人生 > >命令執行順序控制與管道

命令執行順序控制與管道

通常情況下,我們每次只能在終端輸入一條命令,按下回車執行,執行完成後,我們再輸入第二條命令,然後再按回車執行……,當有時候我們會一次輸入多條命令,這個時候的執行過程又是如何的呢?

當我們需要使用apt-get安裝一個軟體,然後安裝完成後立即執行安裝的軟體(或命令工具),又恰巧你的主機才更換的軟體源還沒有更新軟體列表。你會使用如下操作

# 更新軟體源列表
sudo apt-get update
# 安裝你所需要的軟體包
sudo apt-get install some-tool #這裡的some-tool指軟體名
# 啟動軟體
some-tool

上面的命令需要一步一步的執行,當然也可以一步執行,如下

# 通過;來間隔命令
sudo apt-get update;sudo apt-get install some-tool;some-tool

關於上面的操作,不知你有沒有思考過一個問題,如果我們在讓它自動順序執行命令時,前面的命令執行不成功,而後面的命令又依賴於上一條命令的結果,那麼就會造成花了時間,最終卻得到一個錯誤的結果,而且有時候直觀的看你還無法判斷結果是否正確。那麼我們需要能夠有選擇性的來執行命令,比如上一條命令執行成功才繼續下一條,或者不成功又該做出其它什麼處理,比如我們使用which來查詢是否安裝某個命令,如果找到就執行該命令,否則什麼也不做

which cowsay>
/dev/null && cowsay -f head-in ohch~ # 上面的&&是用來實現選擇執行的控制符 # 使用which判斷前面的命令是否執行成功,如前面的命令返回0則執行後面的shell which cowsay>/dev/null || cowsay -f head-in ohch~ # 上面的||和&&是同樣是控制符,只是它和&&的條件是相反的,當前面的語句返回1時繼續執行後面的命令

管道

管道是一種通訊機制,通常用於程序間的通訊(也可通過socket進行網路通訊),它表現出來的形式就是將前面每一個程序的輸出(stdout)直接作為下一個程序的輸入(stdin)。 管道又分為匿名管道和具名管道

先試用一下管道,比如檢視/etc目錄下有哪些檔案和目錄,使用ls命令來檢視:

ls -al /etc

因為檔案太大,螢幕有可能無法完全顯示,這時就可以使用管道

ls -al /etc | less
# 通過管道,將前面命令的輸出做為下一個命令的輸入,這樣就可以一行一行的查看了

cut命令,列印某一行的某一欄位

如列印/etc/passwd下的使用者名稱及使用者目錄以 ==:==為分割符,其中使用者及使用者目錄分別位於1與6欄位

cut /etc/passwd -d ':' -f 1,6

列印/etc/passwd檔案中每一行的前N個字元:

# 前五個(包含第五個)
$ cut /etc/passwd -c -5
# 前五個之後的(包含第五個)
$ cut /etc/passwd -c 5-
# 第五個
$ cut /etc/passwd -c 5
# 2到5之間的(包含第五個)
$ cut /etc/passwd -c 2-5

sort排序命令

sort預設按字典序排序

# 預設為字典排序:

$ cat /etc/passwd | sort

# 反轉排序:

$ cat /etc/passwd | sort -r
# 按特定欄位排序:

$ cat /etc/passwd | sort -t':' -k 3
# 上面的-t引數用於指定欄位的分隔符,這裡是以":"作為分隔符;-k 欄位號用於指定對哪一個欄位進行排序。這裡/etc/passwd檔案的第三個欄位為數字,預設情況下是以字典序排序的,如果要按照數字排序就要加上-n引數:

$ cat /etc/passwd | sort -t':' -k 3 -n