Bash

採用一個修改內聯文件的命令並使其接受標準輸入/標準輸出

  • November 8, 2017

假設我有一個命令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即使事情橫向發展,也可以讓它更加防彈。

引用自:https://unix.stackexchange.com/questions/403383