Script 是一個 Go 庫,用于執行 Shell 腳本擅長的任務:讀取文件,執行子進程,計算行,匹配字符串等。
在 Go 中編寫系統管理程序并不像在傳統的 shell 中那樣容易,而 Script 的出現,剛好彌補了這一問題。即使像 Shell 腳本在數據流(管道)上完成一系列操作,Script 也能做到。
能用 Script 做什麼呢?我們舉個例子,假設您要以字符串形式讀取文件的内容:
contents, err := script.File("test.txt").String()
這看起來很簡單,但假設您現在想要計算該文件中的行數。
numLines, err := script.File("test.txt").CountLines()
對于更具挑戰性的事情,讓我們嘗試計算文件中與字符串“Error”匹配的行數:
numErrors, err := script.File("test.txt").Match("Error").CountLines()
但是,如果不是讀取特定文件,我們想簡單地将輸入輸入到該程序中,并且隻輸出匹配的行(如grep)?
script.Stdin().Match("Error").Stdout()
那太簡單了!因此,讓我們在命令行中傳入一個文件列表,讓我們的程序按順序讀取它們并輸出匹配的行:
script.Args().Concat().Match("Error").Stdout()
那是什麼?您想将該輸出附加到文件而不是将其打印到終端?沒問題:
script.Args().Concat().Match("Error").AppendFile("/var/log/errors.txt")
它是如何工作的?
函數調用看起來有點奇怪。發生了什麼?
關于Unix shell及其許多模仿者的一個有趣的事情是你可以将操作組合成一個管道:
cat test.txt | grep Error | wc -l
管道的每個階段的輸出都會輸入到下一個階段,您可以将每個階段視為一個過濾器,僅将其輸入的某些部分傳遞給其輸出。
相比之下,在原始 Go 中編寫類似 shell 的腳本要方便得多,因為您所做的每件事都會返回不同的數據類型,并且您必須(或至少應該)在每次操作後檢查錯誤。
在用于系統管理的腳本中,我們經常希望以快速方便的方式組合這樣的不同操作。如果在管道的某處發生錯誤,我們想在結束時檢查一次,而不是在每次操作之後檢查。
GitHub 地址:htt
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!