“ls * > file1”有什麼作用?
以下命令在 Linux 中的作用是什麼?
ls * > file1
它是否只是將目前目錄中的所有文件名複製到一個新文件中?
這列出了目前目錄以及子目錄中的所有文件(目前目錄下一級,不是遞歸的),然後將
ls
程序的標準輸出重定向到一個名為file1
如果要列出目前目錄中的所有非隱藏名稱,一次一行,並將該列表寫入一個新文件
list
,請使用ls >list
這將列出目前目錄中的所有名稱並將它們寫入名為
list
. 該列表將包含list
文件本身的名稱。如果要包含隱藏名稱,請使用
ls -a
(或ls -A
不包含.
and..
條目)。請注意,該
list
文件一旦創建,除了用於用眼睛閱讀之外或多或少無用,除非您可以保證沒有任何文件名包含嵌入的換行符。在考慮實際命令的作用之前,您顯示的命令包含 shell 將執行的幾個部分。該命令的最終結果取決於 shell 的目前狀態、目前目錄中文件的名稱和類型以及輸出文件和目前目錄的權限。
- 重定向到
file1
首先執行。如果具有該名稱的文件已經存在,它將被截斷(清空),否則將被創建。shell稍後會將命令的標準輸出流連接到這個文件,命令的所有輸出都將保存在那裡。如果名稱
file1
對應於一個目錄,如果它對應於一個防寫的文件,或者如果由於目前目錄的權限而無法創建輸出文件,則 shell 將發出錯誤消息。在這種情況下,它也會在此時停止命令的處理。 2. 在 shell 可以執行命令之前,它必須弄清楚它的所有參數(注意 the>
和後續file1
不是命令的參數ls
)。在這種情況下,命令行包含不帶引號的萬用字元模式*
,shell 將其替換為該模式匹配的名稱。預設情況下,*
將匹配目前目錄中的所有非隱藏名稱。使用者可以通過設置各種 shell 選項來修改它,以便該模式也匹配隱藏的名稱,或者根本不考慮該模式用於文件名通配。如果該模式與任何名稱都不匹配,則預設情況下它未擴展為文字
*
字元。這取決於目前 shell 中設置的 shell 選項。其他可能的情況包括模式被完全刪除或 shell 發出錯誤消息並在此時停止命令的處理。 3. shell 最終ls
在目前定義的別名、shell 函式和內置實用程序中查找。如果找不到與 對應的名稱,它會嘗試在變數ls
值中列出的目錄中查找執行檔。PATH
如果找不到這樣的執行檔,shell 會發出一條錯誤消息並在此時停止處理該命令。一些 shell 可能會通過執行各種鉤子來繼續處理,這些鉤子建議已知命令的替代拼寫或建議使用者安裝正確的軟體包等。 4. 找到該ls
命令時,會給出任何*
可能擴展為(取決於目前 shell 會話的設置)的參數作為參數,並且該命令會執行其操作。假設
ls
解析為標準ls
命令,它將依次列出每個參數。這將涉及輸出非目錄的名稱和任何目錄參數的內容。如果參數是指向目錄的符號連結,則該目錄的內容也將被輸出。如果
*
在命令行上解析為以破折號開頭的內容,則ls
可以將其解釋為選項而不是文件名。這可能會改變命令的結果。如果
*
由於文件名通配已關閉而保持未擴展,並且如果*
目前目錄中沒有指定文件(正常或其他),則該ls
命令將在其標準錯誤流上發出錯誤消息。如果
*
因為不匹配而被刪除,並且 shell 被配置為刪除不匹配的模式,該ls
命令將列出目前目錄的內容(可能不產生任何輸出)。憑藉在第一步中處理的重定向,該命令在其標準輸出流上產生的任何輸出都將在該文件中結束。