Bash
xargs -I# 顯示意外行為 - 為什麼?
我想壓縮某個目錄中的一大堆文件夾,每個文件夾創建一個 zip 文件。為此,我使用以下命令:
$ find -maxdepth 1 -mindepth 1 -type d | xargs -I@ zip -r @.zip @
這按預期工作。
但是,偶然地,我注意到當我用作
#
替換字元串而不是@
:$ find -maxdepth 1 -mindepth 1 -type d | xargs -I# zip -r #.zip # zip error: Invalid command arguments (cannot write zip file to terminal) zip error: Invalid command arguments (cannot write zip file to terminal) ... and so on (the same message repeated for every folder)
#
通常會打開評論,所以很明顯這裡出了問題。但我原以為命令行實際上會變成find -maxdepth 1 -mindepth 1 -type d | xargs -I
,因為第一個(包括)第一個的所有內容#
都是註釋並且被剝離。但是,它顯然執行了
zip
命令。為什麼?
註釋(在
bash
shell 中)由#
字元引入。但這僅在#
字元未加引號且單詞中的第一個字元(標記)時才會發生。如果
#
被引用或作為單詞中第一個字元以外的字元出現,則不會引入註釋。相比:
$ echo this is a #comment this is a $ echo this is not a#comment this is not a#comment $ echo not a '#comment' not a #comment
在互動式 shell 中,如果shell 選項關閉(預設為打開) ,則永遠不會引入註釋。
interactive_comments
$ shopt -u interactive_comments $ echo not a #comment not a #comment