Bash
採用一個修改內聯文件的命令並使其接受標準輸入/標準輸出
假設我有一個命令
foo
,它接受一個文件並在該文件中執行一些轉換(類似於sed -i
)。假設這個命令不接受經典的“從標準輸入讀取,轉換,寫入標準輸出”選項。有沒有辦法“轉換”這個命令,以便它允許使用標準輸入/標準輸出工作流程?
我能想到的第一件事是編寫某種使用臨時文件的包裝器。但我想知道是否有某種標準化的“元工具”可以做到這一點(或一些 bash 詭計)。
這有點俗氣,但是:
my_temp_file=$(mktemp) cat > "$my_temp_file" foo "$my_temp_file" cat "$my_temp_file" rm -f "$my_temp_file"
如果不是很明顯,這個
- 讀取標準輸入並將其寫入文件,
- 在臨時文件上呼叫您的
foo
程序,- 讀取臨時文件並將其寫入標準輸出,並且
- 刪除臨時文件。
如果要處理的數據太大而無法放入
/tmp
. 您可以通過使用 將臨時文件放在具有更多可用空間的文件系統中的--tmpdir
選項來稍微緩解這種情況。mktemp
如今,將命令與連接
&&
起來風靡一時。說起來可能更有意義my_temp_file=$(mktemp) && { cat > "$my_temp_file" && { foo "$my_temp_file" cat "$my_temp_file" } rm -f "$my_temp_file" }
因為
- 如果
mktemp
失敗,你沒有臨時文件,你也無能為力,- 如果
cat > "$my_temp_file"
失敗,您還沒有擷取輸入,所以您無能為力(除非您仍想刪除臨時文件)如果退出狀態
foo
對您很重要,請適當處理。
trap
可選地,通過設置一個來做這件事,rm
即使事情橫向發展,也可以讓它更加防彈。