linuxshell管道
① linux-shell基礎(七)
Linux Shell 基礎七:操作與腳本編寫
常用編輯器包括 vim、nano、Emacs、Kwrite、Kate 及 GNOME,熟悉一種風格足以。了解其常用操作與命令是基礎。
Shell 腳本精髓在於串聯命令,同時處理其結果,甚至將一個命令的結果傳遞給另一個,實現一次性執行。
多個命令可以寫在同一行,用分號隔開。但每次執行仍需手動輸入。通過將命令放入文本文件,可批量執行。
使用 `echo` 命令,可顯示腳本執行內容。
引入變數,包括環境變數和自定義變數(注意大小寫區分)。通過 `$` 符號引用變數。
命令替換,將命令輸出賦值給變數,可用 `()` 或者 `(``)` 實現。
輸出重定向功能,將命令輸出發送至文件。使用較為繁瑣,有時可直接將命令傳遞給另一個命令,利用管道簡化。
數學運算需藉助 `expr` 命令,表現一般。浮點運算則推薦使用 `bc` 計算器。
優雅退出腳本,Shell 使用退出狀態碼反饋命令執行結果。正常終止的退出碼為 0,錯誤終止則為正整數(最大 255)。通過 `exit` 命令可指定退出碼。
實例演示,展示如何在 Shell 腳本中應用上述概念與技巧。
② Linux Shell
Linux Shell 是用戶與操作系統交互的界面,它提供了多種命令供用戶執行操作,本文將詳細介紹一些常用命令。
1. 終端快捷鍵:在Linux Shell中,有一些快捷鍵能提高操作效率,例如Ctrl+A可以選中屏幕中的所有內容,Ctrl+C停止執行當前命令,Ctrl+D退出當前Shell。
2. 切換路徑 cd:用戶可以使用cd命令在不同的目錄間切換,例如cd /root 進入root用戶目錄,cd .. 返回上一級目錄。
3. 查看目錄信息:使用ls命令查看當前目錄下所有文件和目錄的列表。使用ls -l列出文件的詳細信息,包括文件許可權、文件大小、創建日期等。
4. 創建文件夾:使用mkdir命令創建新的目錄,例如mkdir newdir。
5. 新建文件:使用touch命令創建新文件,例如touch newfile。
6. 重定向:在Linux Shell中,可以使用>和>>符號將命令的輸出重定向到文件,例如ls > output.txt。
7. 管道 |:管道命令將前一個命令的輸出作為後一個命令的輸入,實現數據流的傳遞,例如ls | grep .txt。
8. 文件操作:使用cat命令查看文件內容,使用more和less命令分頁查看大文件。使用head和tail命令查看文件的開頭和結尾。
9. 查看文件:使用less命令分頁查看文件內容,使用more命令逐頁查看文件內容。使用cat命令查看文件的全部內容。
10. 查找文本:使用grep命令在文件中查找指定文本,例如grep "Linux" file.txt。
11. 遠程管理:使用ssh命令實現遠程登錄和文件傳輸,例如ssh user@host。
12. 組、用戶和許可權:使用groupadd命令創建新用戶組,使用useradd命令創建新用戶。使用chmod命令修改文件和目錄許可權,使用chown命令修改文件和目錄所有者。
13. 系統信息:使用uname命令查看系統信息,例如uname -a查看系統詳細信息。使用df命令查看磁碟使用情況。
14. 軟鏈接:使用ln命令創建軟鏈接,例如ln -s originalfile symlink。
15. 打包壓縮:使用tar命令進行打包和壓縮,例如tar -cvf archive.tar file1 file2。使用gzip命令進行壓縮,例如gzip file。
16. 軟體安裝與卸載:使用apt-get命令進行軟體包管理,例如sudo apt-get install software。使用dpkg命令安裝和卸載軟體包,例如sudo dpkg -i package.deb。
17. 其他:Linux Shell還提供了大量的其他命令供用戶使用,例如find命令用於查找特定文件,rsync命令用於遠程文件同步等。
③ linux shell中關於輸入重定向的問題
重定向就是這樣的,命令的結果只能輸出到一個地方,了解原理就可以理解了。
在 IO Redirection 中,stdout 或 stderr 的管道總是會先准備好,然後才將命令執行結果給導入。
你給的例子中,先重定向到/111.txt,再重定向到/222.txt,因此管道最終是接入了/222.txt。stdout只有一根管道,輸入端是固定的,你只是在不停地移動輸出端,當然是以最後的為准啦。
建議你去看看《Shell十三問》,裡面有關於 IO Redirection 的詳細解釋。
解決方法就是用 tee 命令:
ls -l | tee /111.txt > /222.txt
④ linux命令中的「<」和「|」是什麼意思
」<」 表示的是輸入重定向的意思,就是把<後面跟的文件取代鍵盤作為新的輸入設備。
」| 」則表示一個管道的意思,可以理解為東西從管道的一邊流向另外一邊。
⑤ Linux進程間通信
linux下進程間通信的幾種主要手段簡介:
一般文件的I/O函數都可以用於管道,如close、read、write等等。
實例1:用於shell
管道可用於輸入輸出重定向,它將一個命令的輸出直接定向到另一個命令的輸入。比如,當在某個shell程序(Bourne shell或C shell等)鍵入who│wc -l後,相應shell程序將創建who以及wc兩個進程和這兩個進程間的管道。
實例二:用於具有親緣關系的進程間通信
管道的主要局限性正體現在它的特點上:
有名管道的創建
小結:
管道常用於兩個方面:(1)在shell中時常會用到管道(作為輸入輸入的重定向),在這種應用方式下,管道的創建對於用戶來說是透明的;(2)用於具有親緣關系的進程間通信,用戶自己創建管道,並完成讀寫操作。
FIFO可以說是管道的推廣,克服了管道無名字的限制,使得無親緣關系的進程同樣可以採用先進先出的通信機制進行通信。
管道和FIFO的數據是位元組流,應用程序之間必須事先確定特定的傳輸"協議",採用傳播具有特定意義的消息。
要靈活應用管道及FIFO,理解它們的讀寫規則是關鍵。
信號生命周期
信號是進程間通信機制中唯一的非同步通信機制,可以看作是非同步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展後,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。
可以從兩個不同的分類角度對信號進行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時間的關繫上:實時信號與非實時信號。
(1) 可靠信號與不可靠信號
不可靠信號 :Linux下的不可靠信號問題主要指的是信號可能丟失。
可靠信號 :信號值位於SIGRTMIN和SIGRTMAX之間的信號都是可靠信號,可靠信號克服了信號可能丟失的問題。Linux在支持新版本的信號安裝函數sigation()以及信號發送函數sigqueue()的同時,仍然支持早期的signal()信號安裝函數,支持信號發送函數kill()。
對於目前linux的兩個信號安裝函數:signal()及sigaction()來說,它們都不能把SIGRTMIN以前的信號變成可靠信號(都不支持排隊,仍有可能丟失,仍然是不可靠信號),而且對SIGRTMIN以後的信號都支持排隊。這兩個函數的最大區別在於,經過sigaction安裝的信號都能傳遞信息給信號處理函數(對所有信號這一點都成立),而經過signal安裝的信號卻不能向信號處理函數傳遞信息。對於信號發送函數來說也是一樣的。
(2) 實時信號與非實時信號
前32種信號已經有了預定義值,每個信號有了確定的用途及含義,並且每種信號都有各自的預設動作。如按鍵盤的CTRL ^C時,會產生SIGINT信號,對該信號的默認反應就是進程終止。後32個信號表示實時信號,等同於前面闡述的可靠信號。這保證了發送的多個實時信號都被接收。實時信號是POSIX標準的一部分,可用於應用進程。非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。
發送信號的主要函數有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。
調用成功返回 0;否則,返回 -1。
sigqueue()是比較新的發送信號系統調用,主要是針對實時信號提出的(當然也支持前32種),支持信號帶有參數,與函數sigaction()配合使用。
sigqueue的第一個參數是指定接收信號的進程ID,第二個參數確定即將發送的信號,第三個參數是一個聯合數據結構union sigval,指定了信號傳遞的參數,即通常所說的4位元組值。
sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進程發送信號。sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進程發送信號。
inux主要有兩個函數實現信號的安裝: signal() 、 sigaction() 。其中signal()在可靠信號系統調用的基礎上實現, 是庫函數。它只有兩個參數,不支持信號傳遞信息,主要是用於前32種非實時信號的安裝;而sigaction()是較新的函數(由兩個系統調用實現:sys_signal以及sys_rt_sigaction),有三個參數,支持信號傳遞信息,主要用來與 sigqueue() 系統調用配合使用,當然,sigaction()同樣支持非實時信號的安裝。sigaction()優於signal()主要體現在支持信號帶有參數。
消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優先順序。對消息隊列有寫許可權的進程可以向中按照一定的規則添加新消息;對消息隊列有讀許可權的進程則可以從消息隊列中讀走消息。消息隊列是隨內核持續的
消息隊列的內核持續性要求每個消息隊列都在系統范圍內對應唯一的鍵值,所以,要獲得一個消息隊列的描述字,只需提供該消息隊列的鍵值即可;
消息隊列與管道以及有名管道相比,具有更大的靈活性,首先,它提供有格式位元組流,有利於減少開發人員的工作量;其次,消息具有類型,在實際應用中,可作為優先順序使用。這兩點是管道以及有名管道所不能比的。同樣,消息隊列可以在幾個進程間復用,而不管這幾個進程是否具有親緣關系,這一點與有名管道很相似;但消息隊列是隨內核持續的,與有名管道(隨進程持續)相比,生命力更強,應用空間更大。
信號燈與其他進程間通信方式不大相同,它主要提供對進程間共享資源訪問控制機制。相當於內存中的標志,進程可以根據它判定是否能夠訪問某些共享資源,同時,進程也可以修改該標志。除了用於訪問控制外,還可用於進程同步。信號燈有以下兩種類型:
int semop(int semid, struct sembuf *sops, unsigned nsops); semid是信號燈集ID,sops指向數組的每一個sembuf結構都刻畫一個在特定信號燈上的操作。
int semctl(int semid,int semnum,int cmd,union semun arg)
該系統調用實現對信號燈的各種控制操作,參數semid指定信號燈集,參數cmd指定具體的操作類型;參數semnum指定對哪個信號燈操作,只對幾個特殊的cmd操作有意義;arg用於設置或返回信號燈信息。
進程間需要共享的數據被放在一個叫做IPC共享內存區域的地方,所有需要訪問該共享區域的進程都要把該共享區域映射到本進程的地址空間中去。系統V共享內存通過shmget獲得或創建一個IPC共享內存區域,並返回相應的標識符。內核在保證shmget獲得或創建一個共享內存區,初始化該共享內存區相應的shmid_kernel結構注同時,還將在特殊文件系統shm中,創建並打開一個同名文件,並在內存中建立起該文件的相應dentry及inode結構,新打開的文件不屬於任何一個進程(任何進程都可以訪問該共享內存區)。所有這一切都是系統調用shmget完成的。
shmget()用來獲得共享內存區域的ID,如果不存在指定的共享區域就創建相應的區域。shmat()把共享內存區域映射到調用進程的地址空間中去,這樣,進程就可以方便地對共享區域進行訪問操作。shmdt()調用用來解除進程對共享內存區域的映射。shmctl實現對共享內存區域的控制操作。這里我們不對這些系統調用作具體的介紹,讀者可參考相應的手冊頁面,後面的範例中將給出它們的調用方法。
註:shmget的內部實現包含了許多重要的系統V共享內存機制;shmat在把共享內存區域映射到進程空間時,並不真正改變進程的頁表。當進程第一次訪問內存映射區域訪問時,會因為沒有物理頁表的分配而導致一個缺頁異常,然後內核再根據相應的存儲管理機制為共享內存映射區域分配相應的頁表。