cat `-q` file (in linux) - 传递看起来像选项的操作数

cat `-q` file (in linux) - passing operands that look like options

我有一个文件,名字是-q(看起来是无意中制作的)

我想看看它的内容,所以我尝试了这些

$ cat '-q'
$ cat "-q"
$ cat $'-q'

但没有任何效果。(都给出相同的错误cat: invalid option -- 'q'

有什么办法可以看到它的内容吗?

创建一个名为 -q 的文件 do

touch -- "-q"

并查看其内容

cat -- '-q' # Used single quotes to treat anything inside as literal characters

应该这样做。 -- 表示后面的内容应该被视为位置参数。


请花点时间看看@rici 的[ answer ],它提醒了一些关于单引号和双引号的微妙方面。

提供了可行的解决方案,但值得 深入挖掘:

传递给 Unix 实用程序的参数(例如 cat)可以分为两组(使用 POSIX 术语):

  • options(例如,-l;取决于选项的定义,可能后跟 option-argument) - 修改实用程序基本行为的开关.

  • 操作数(例如,文件名)- 实用程序操作的数据

POSIX requires all options, if any, to come before any operands,但 GNU 实用程序放宽了此要求以允许混合选项和操作数以方便使用。

无论哪种方式,- 后跟字母或数字通常表示 选项

以便允许传递操作数 恰好-开始,特殊选项-- 可用于告诉任何实用程序:将任何后续参数视为 操作数 ,即使它们 看起来 像选项.


由于操作数 -q 在这种情况下 看起来 像一个选项,在它前面加上 -- 以将其标记为 操作数 是必须的。

至于如何将字符串 -q 本身作为参数传递:

  • -q包含没有shell元字符,所以shell 将其 按原样 传递给 cat - 无需引用。

  • 引用 ('-q', "-q", $'-q', \-q) 在这种情况下没有坏处,但这里绝对 没有效果 ,因为 shell - 在应用任何扩展之后 - 只是 删除 任何引号字符(一个名为 quote removal) before passing the word to cat (as Charles Duffy 的过程会在问题的评论中注明)。