Bash

xargs -I# 顯示意外行為 - 為什麼?

  • April 22, 2022

我想壓縮某個目錄中的一大堆文件夾,每個文件夾創建一個 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命令。為什麼?

註釋(在bashshell 中)由#字元引入。但這僅在#字元未加引號且單詞中的第一個字元(標記)時才會發生。

如果#被引用或作為單詞中第一個字元以外的字元出現,則不會引入註釋。

相比:

$ 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

引用自:https://unix.stackexchange.com/questions/699972