2017年11月30日 星期四

Bash Shell | 如何將程序的輸出入結果做為程式參數 Process Substitution

Process Substitution 有兩種使用方式
1. <(list)
   <(list) 整個可以視為一個檔名看待,因此可以當做另一個程式的參數使用,當然也可
   以當作 redirection 使用。想像 list 程式的輸出會存到一個暫存檔,讓另一個程
   式以參數的形式取得暫存檔,並讀取暫存檔的內容。

   使用多個參數的程式可以利用此功能,例如 cmp 會用到兩個參數,當要比較的內容是由
   其它程式的輸出而來,則不用先將其它程式的輸出分別存到暫存檔,再用 cmp 比較暫存
   檔。底下範例用來比較兩個目錄下是否有一樣的檔案名稱,但不支援子目錄的比較。

範例:

#!/bin/sh

mkdir -p folder1
mkdir -p folder2

touch folder1/file1
touch folder2/file2

# Disable POSIX mode because process substitution is not 
# available in POSIX mode
set +o posix

if cmp -s <(ls folder1) <(ls folder2); then
        echo "folder1 and folder2 are the same."
else
        echo "folder1 and folder2 are different."
fi

touch folder1/file2
touch folder2/file1

if cmp -s <(ls folder1) <(ls folder2); then
        echo "folder1 and folder2 are the same."
else
        echo "folder1 and folder2 are different."
fi

結果:

folder1 and folder2 are different.
folder1 and folder2 are the same.

2. >(list)
   >(list) 整個可以視為一個檔名看待,因此可以當做另一個程式的參數使用,當然也可
   以當作 redirection 使用,想像有一個暫存檔當做 list 程式的輸入,另一個程式
   以參數的形式取得暫存檔,對暫存檔的輸出都變成 list 程式的輸入。

沒有留言:

張貼留言