Bash
子shell相對於重定向的優先級?
外殼:GNU BASH
我已經使用以下命令一段時間了:
echo "$(fmt -w 50 < foo.txt)" > foo.txt
沒有任何問題。但是,當我嘗試:
fmt -w 50 < foo.txt > foo.txt
文件 foo.txt 變成了一個空白文件。我認為這是因為與重定向運算符和由 shell 解析的子 shell 的優先級有關。
搜尋 GNU BASH 手冊並不是很有成效。如果我錯過了手冊中的某些內容,有人可以告訴我嗎?我真的很想了解這種行為的原因,以便我可以進一步使用它並了解它可能導致麻煩的任何情況。
來自 Bash 手冊,3.7.1 簡單命令擴展:
執行簡單命令時,shell 從左到右執行以下擴展、賦值和重定向。
- 解析器標記為變數分配的詞(命令名稱之前的那些)和重定向被保存以供以後處理。
- 不是變數賦值或重定向的詞被擴展(參見Shell Expansions)。如果展開後還剩下任何單詞,則將第一個單詞作為命令的名稱,其餘單詞作為參數。
- 如上所述執行重定向(請參閱重定向)。
- 在分配給變數之前,每個變數賦值後的文本
=
都經過波浪號擴展、參數擴展、命令替換、算術擴展和引號刪除。命令替換是(2)中發生的擴展之一,重定向發生在(3)之後。這與子shell 沒有任何關係,純粹是由於shell 執行操作的順序。
(fmt -w 50 < foo.txt) > foo.txt
也會導致一個空白文件。