我想讓下面的代碼適用于 Swift,沒有代碼就可以正常作業,/dev/null 2>&1只要我添加/dev/null 2>&1,它就不起作用,我怎樣才能正確添加它?
let task = Process()
task.executableURL = URL(fileURLWithPath: "/bin/bash/dev/null 2>&1")
task.arguments = ["-c", """
echo "Hello, world!"
cd ${HOME}
cd Desktop
mkdir "New Folder"
echo "Folder is Successfully created!"
"""]
task.launch()
uj5u.com熱心網友回復:
這里有兩個主要問題:
- 您要運行的二進制檔案的可執行 URL 需要指向該二進制檔案——它不能接受引數,因為
/bin/bash/dev/null 2>&1它不是磁盤上的有效路徑。如果要運行/bin/bash,可執行的 URL 只能包含/bin/bash - 您嘗試執行的重定向也沒有完全正確地寫出。簡要地:
2>&1inbash表示“請將stderr(2)指向stdout(1) 當前指向的位置”- 為了首先重定向
stdout,僅僅指定是不夠的/dev/null——你需要告訴bash“請指向stdout”/dev/null,這是用簡寫完成的>/dev/null(注意前導的>意思是“重定向”)
這些重定向的語法是您正在運行的實際shellbash的一部分,雖然可能理解>/dev/null,但這并不適用于所有行程。
您可以請求此重定向的一種方法bash是將重定向請求包含在您正在運行的 shell 腳本中(即,您傳入的內容-c)。這開始進入細節bash以及它如何處理重定向,但是如何實作這一點的示例:
task.arguments = ["-c", """
exec >/dev/null 2>&1
# The rest of your script.
"""]
該exec行會導致bash重定向,并且它在腳本的其余部分保持活動狀態。解釋細節可能超出范圍,但請查看如何在腳本本身內重定向整個 shell 腳本的輸出?想要查詢更多的資訊。
然而:
而不是這種bash特定的方法,一種不那么脆弱且更具表現力的方式來實作這一點是顯式地設定自身的.standardOutputand.standardError屬性Process。您可以使用以下內容完全重定向stdout和stderr從外部重定向:bash
let task = Process()
task.executableURL = URL(fileURLWithPath: "/bin/bash")
task.arguments = ["-c", "..."]
task.standardOutput = FileHandle.nullDevice // Equivalent to /dev/null
task.standardError = FileHandle.nullDevice
task.launch()
.standardInput, .standardOutput, 和幫助指示流程.standardError的Process輸入來自哪里,以及它的輸出去哪里。默認情況下,這些是從您當前的行程繼承的(這就是為什么您甚至會bash在自己的輸出中看到 's 輸出開始),但是您可以分配 aFileHandle以將輸出寫入檔案,或設定 aPipe能夠直接讀取輸出。
上述重定向適用于任何行程,而不僅僅是bash,建議您使用這些語意屬性而不是依賴bash決議。
如果您不關心/dev/null具體重定向到,您可以關閉行程stdout并stderr通過傳入nil而不是FileHandle.nullDevice:
task.standardOutput = nil
task.standardError = nil
對于此特定應用程式,此分配將與重定向到相同的效果/dev/null:腳本的輸出將被靜音。
這些在技術上是有區別的(如果腳本正在檢查它stdout的stderr輸出位置),但在最常見的用例中,這將是等價的。考慮將其用作FileHandle.nullDevice直接參考的“簡化”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420372.html
標籤:
下一篇:如何僅將awk命令應用于特定欄位
