我想压缩某个目录中的一大堆文件夹,为每个文件夹创建一个 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
命令。为什么?
答案1
注释(在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 中,注释是绝不interactive_comments
如果shell 选项关闭(默认情况下打开),则引入。
$ shopt -u interactive_comments
$ echo not a #comment
not a #comment