xargs -I# 显示意外行为 - 为什么?

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命令。为什么?

答案1

注释(在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 中,注释是绝不interactive_comments如果shell 选项关闭(默认情况下打开),则引入。

$ shopt -u interactive_comments
$ echo not a #comment
not a #comment

相关内容