如何防止 Bash 扩展传递以“-”开头的文件作为参数?

如何防止 Bash 扩展传递以“-”开头的文件作为参数?

我正在尝试递归搜索字符串,grep但我得到了这个:

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

如何防止 Bash 传递以-as 参数开头的文件?

答案1

首先,请注意,以破折号开头的参数的解释取决于正在启动的程序grep或其他程序。 shell 没有直接的方法来控制它。

假设您想要处理此类文件(而不是完全忽略它们),grep与大多数程序一样,会识别--为指示选项结束,因此

grep -r -e "stuff" -- *

会做你想做的事。那里-e的 case也stuff以 a 开头。-

或者,您也可以使用:

grep -r -e "stuff"  ./*

-如果当前目录中有一个文件被调用,后一个也可以避免这个问题。即使在--分隔符之后,grep也解释-为 stdin,而是在当前目录中./-调用的文件。-

答案2

防止 Bash 扩展传递以“-”开头的文件您可以使用:

echo [!-]*

它可以在大多数 shell 中移植,或者特定于 ksh、bash、zsh:

echo !(-*)

例如:在包含此文件的目录中

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

仅列出(前提extglob是处于活动状态):

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

但是,如果您想要处理所有文件,同时告诉 grep 避免解释使用 a-作为选项声明的文件,那么只需添加一个./

grep -r "stuff" ./*

或者,如果保证-列出的文件中不存在完全被调用的文件(grep 会将孤独解释-从标准输入读取), 您可以使用:

grep -r -- "stuff" *

相关内容