1. 程式人生 > >關於shell的程序替換process substitution,日誌檔案與螢幕同顯:exec &> >(tee "$log_file")的解釋說明

關於shell的程序替換process substitution,日誌檔案與螢幕同顯:exec &> >(tee "$log_file")的解釋說明

一、解釋程序替換

程序替換僅僅在支援命名管道(FIFO)或/dev/fd來命名開啟的檔案的系統上可用。它採取的形式是:

<(list)

>(list)

程序list執行時,輸入或輸出連線到FIFO或在/dev/fd中的檔案。作為擴充套件的結果,把此檔名作為引數傳遞到當前命令。如果使用>(list)的形式,對該檔案的寫入,將為list提供輸入。如果使用<(list)形式時,作為引數傳遞的檔案應被讀取,以獲得list的輸出。需要注意的<或>和左括號之間是沒有空格的,否則將被解釋為重定向。
當程序替換可用時,程序替換和引數變數擴充套件,命令替換和算術擴充套件,同時進行。

===============================初步解釋============================

上面是官方手冊給出的解釋,說的可能有點晦澀難懂,不用急,下面慢慢說來:

程序替換會跟/dev/fd/<n>系統中的檔案關聯起來,該系統檔案會作為引數傳遞給其他命令,其他命令對該檔案進行的是讀取還是輸出到該檔案取決於程序替換格式是小於號還是大於號。如果是>()格式(大於號表示輸入到括號中):該系統檔案為括號中的命令提供輸入,如果是<()格式(小於號表示從括號中輸出出去):該/dev/fd/<n>檔案接收括號中命令的輸出,然後該檔案被其他命令作為引數讀取以獲得括號中命令的輸出。

=========================如果還是不懂,看下面例子=========================

舉例子:exec &> >(tee "$log_file") #將shell指令碼中標準輸出和錯誤輸出都寫入日誌檔案中同時在螢幕上顯示。

程序替換指的是一個命令的輸出作為另一個命令的輸入,>()等效為/dev/fd/<n>檔案,也就是exec &> /dev/fd/<n>,將標準輸出和錯誤輸出都重定向到/dev/fd/<n>檔案中,<n>表示第n號檔案,可以去該目錄下看看,有很多序號的檔案,一般用的是63號檔案,該檔案是系統內部,你檢視不到的。

之後程序替換中的tee命令讀取/dev/fd/<n>檔案作為括號中tee命令的輸入(也就是讀取/dev/fd/<n>檔案)。

說明:tee命令是需要輸入的,將輸入到該命令的文字同時輸出到螢幕和引數指定的檔案中。

============================================

回頭再看官方解釋應該就覺得還是官方解釋的簡潔到位。

另外不是任何命令都支援程序替換的

實現機制:程序替換有兩種實現方式,在支援/dev/fd的系統中,他通過呼叫pipe()系統呼叫來實現,這個系統呼叫將為新的匿名管道返回一個檔案描述符,然後建立字串/dev/fd/$fd,再替換命令列。在不支援/dev/fd的系統中,它將呼叫mkfifo命令後跟一個臨時檔名來建立一個命名管道(named pipe),之後在命令列中替換為這個檔名。為了闡明所涉及的步驟,考慮下面支援/dev/fd的系統上的簡單的命令替換:

diff file1 <(sort file2)

shell執行步驟:

1. 建立一個新的匿名管道。這個管道可以用類似/dev/fd/63的東西來訪問;你可以用類似echo <(true)的命令來檢視它(譯者注:它這裡指/dev/fd/63)。

2. 在後臺執行程序替換的命令(這裡指sort file2),將其輸出管道連線到匿名管道。

3. 執行主要的命令,用匿名管道的路徑替換這個程序替換指令(指<(……)這種指令格式),在這個例子中,完全的命令可以被展開成如下形式:

diff file1 /dev/fd/63

 4. 執行完成後,關閉匿名管道。

對於命名管道,在管道的建立和刪除方面的執行過程是完全不同的。建立使用mkfifo,刪除使用unlink,其餘方面都差不多。

參考資料:

相關推薦

關於shell程序替換process substitution日誌檔案螢幕exec &> >(tee "$log_file")的解釋說明

一、解釋程序替換 程序替換僅僅在支援命名管道(FIFO)或/dev/fd來命名開啟的檔案的系統上可用。它採取的形式是: <(list) 或 >(list) 程序list執行時,輸入或輸出連線到FIFO或在/dev/fd中的檔案。作為擴充套件的結果

shell 清空指定大小的日誌檔案

  #!/bin/bash # 當/var/log/syslog大於68B時 if ! [ -f /var/log/syslog ] then echo "file not exist!" exit 1 fi if [ `ls -l /var/log/syslog|awk '{

通過process獲取mysqlbinlog日誌檔案

package com.whaty.getConfigSql.service.impl; import com.whaty.cbs.core.dao.EntityDao; import com.whaty.cbs.core.util.DateUtil; import com.whaty

shell 處理將動態解析的日誌檔案

有時候,我們需要對一些程式的日誌檔案進行資料分析,如果是我們自己處理和分析的情況下一般是使用程式讀取對應日誌檔案按照對應規則儲存到資料庫然後再進行分析。 如果我們直接到日誌檔案進行分析,我們沒有辦法記錄以及分析過的。因為日誌檔案是隨時在增加的。但是我們程式讀取

定時清理日誌檔案

1,find ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的引數; pathname: find命令所查詢的目錄路徑。例如用.來表示當前目錄,用

java檔案class檔案dex檔案的轉化。(詳細教程)

筆者這兩天整理的關於安卓逆向的一些小知識:教你如何在這三種檔案中來去自如: .java檔案 Java原始檔 .class檔案 Java位元組碼檔案,是一種能夠被Java虛擬機器(JVM:Java Virtual Machine)識別,載入並且執行的檔案格式。 .

.net裡如何很好的使用cs頁面js檔案aspx頁面裡的各個引數相互使用

今天講一下如何很好的操控對於cs頁面與aspx頁面的引數的很好的利用的問題:很多和我一樣開發的碼農在開發的過程中會遇到,一些引數想使用但是不知道怎麼使用的時候,這裡我把我遇到的一些情況和大家分享一下,如果有爭議,可以留言指出,再次先謝謝了。 首先我們都知道,在aspx頁面一

fopen文字檔案二進位制檔案

暮鼓集    行走集 在學習C語言檔案操作後,我們都會知道開啟檔案的函式是fopen,也知道它的第二個引數是標誌字串。其中,如果字串中出現’b’,則表明是以開啟二進位制(binary)檔案,否則是開啟文字檔案。 那麼甚麼是文字檔案,甚麼是二進位

【Linux】遍歷某一目錄判斷檔案資料夾main引數

LINUX下遍歷目錄的核心標頭檔案是#include <dirent.h>,方法一般是這樣的:開啟目錄->讀取->關閉目錄。相關函式有:DIR *opendir(const char *dirname);struct dirent *readdir(

mysql日誌檔案開啟及詳解General_log 和 Binlog

背景: 週末歸納下mysql的日誌檔案,其中general_log在mysql入侵中已經用到過,binlog即將會用到。注:mysql版本為5.7.20 General_log 詳解 1.介紹 開啟 general log 將所有到達MyS

C++類定義.h檔案.cpp檔案之間的關係以及條件編譯

大家有沒有考慮過,我們問什麼要將一個類定義和類實現分開呢? 本週的Windows程式設計課,老師演示了一個例子,完美地講解了這個問題,在我看來是解答了我一直以來的疑問,下面把我的一些體會整理在下面。 使整個大的程式或者說專案顯得邏輯清晰、分明 最重要的,也

PythonPycharmAnaconda 區別聯絡——Python入門Win10_X64下_Anaconda和Pycharm的安裝和配置

1、Python,Pycharm,Anaconda 區別與聯絡 子曰:“工欲善其事,必先利其器”  學習Python就需要有編譯Python程式的軟體,一般情況下,我們選擇在Python官網下載對應版本的Python然後用記事本編寫,再在終端進行編譯執行即可。而在許多教程都

檔案記憶體的橋樑頁快取

作者:Gustavo Duarte 翻譯:fleurer 原文:page-cache-the-affair-between-memory-and-files 前面我們觀察了核心為使用者程序管理虛擬記憶體的方法,簡單起見,一時忽略了檔案和IO。本文則著重討論下這塊,說說檔案

shell遍歷當前目錄下的檔案用去掉檔案字尾的字串替換檔案中的文字

今天寫了一個shell,遍歷當前目錄下的檔案,用每個檔案的檔名去掉字尾的字串替換檔案中的一段字串。  指令碼如下: #!/bin/bashfile=`ls *.html`;echo $filefor item in $filedo filename=${item

Shell腳本動態分析maillog日誌把惡意IP用防火墻禁止

"shell腳本" "maillog" 用Shell腳本動態分析maillog日誌,把惡意IP用防火墻禁止系統環境:Centos 6.5 x64 Postfix郵件系統裝好後,發現maillog中太多“SASL LOGIN authentication fai

shell指令碼限制日誌檔案大小和行數

背景: 專案server在後端持續執行,日誌檔案不斷變大,需及時進行清空。 解決方案:編輯sh指令碼,指定時間間隔輪詢;將超出限制的日誌檔案,先備份,再清空原日誌檔案內容。 清空日誌檔案內容的方法有:             1

log4j不列印sql不輸出日誌檔案到指定目錄

#log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=infoA,errorA,CONSOLE,DEBUGA //注意這裡不要用INFO,DEBUG等 改個名字 log4j.appender.CONSOLE=org.apach

檔案的壓縮日誌管理ip地址設定的三種方法

tar                                  ##歸檔檔案(把多個檔案變成一個檔案)   &

自動建立hibernate。配置檔案對映實體自動生成日誌的配置

            建立db                   空白處ne

shell 指令碼替換檔案中的某個字串

1、將當前目錄下包含"qwe"串的檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” grep "qwe" -rl ./ 2、將某個檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” test.txt 如果將某個檔案