我不小心创建了一个名为-
(例如seq 10 > -
)的文件。然后我尝试使用less
查看它,但它只是挂起。
我知道发生这种情况是因为less -
需要来自 的输入stdin
,因此它不会将 解释-
为文件名。我尝试过less \-
,但它也不起作用。
那么,有什么方法可以表明less
这-
是一个文件而不是标准输入吗?
我能得到的最好的是:
find -name '-' -exec less {} +
答案1
只需添加前缀./
:
less ./-
或者使用重定向:
less < -
请注意,由于-
(相对于-x
或--foo--
例如)被视为特殊文件名而不是选项,因此以下内容不起作用:
less -- - # THIS DOES NOT WORK
答案2
我只会mv - f && less f
。问题解决了。
答案3
笔记:我的答案是不是在OP的情况下有效,并且仅适用于遵循下面提到的约定的工具,而不是在文件名恰好为(破折号)的情况下-
,这通常也是指定期望从标准输入读取的特殊情况。查看已接受的答案。
将其留在这里,因为它包含对其他情况有用的信息,人们在寻找答案时可能会偶然发现这些信息。
双破折号吧!
使用标准双破折号 ( --
) 约定来指示最后一个参数:
less -- -FILENAME
例子
$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!
什哈阿特?
这个--
论点源于大多数 shell 实用程序和命令行工具的实现都支持的约定,并且大多数 shell 会明显主张您在实现 CLI 工具时应该遵循它。
公开组推荐
OpenGroup 在 中也提到了这一点实用程序描述默认值其基本规范的 (v6) 部分:
默认行为:[...] 不接受选项但接受操作数的标准实用程序应将“--”识别为要丢弃的第一个参数。
识别“--”的要求是因为符合要求的应用程序需要一种方法来保护其操作数免受实现可能作为扩展提供的任何任意选项的影响。例如,如果标准实用程序 foo 被列为不带任何选项,并且应用程序需要为其提供带有前导连字符的路径名,则可以安全地执行以下操作:
foo -- -myfile
并避免使用 -m 作为扩展名出现任何问题。
并且在实用程序语法指南(v7):
准则 10: 第一个不是选项参数的 -- 参数应该被接受作为指示选项结束的分隔符。任何后续参数都应被视为操作数,即使它们以“-”字符开头。
巴什推荐
这里摘录自 bash 手册,介绍了支持它的内置函数:
除非另有说明,本节中记录的每个内置命令都接受选项,前面带有 -accepts-- 表示选项的结束。
:、true、false 和 test 内置函数不接受选项,也不特殊对待 -- 。 exit、logout、break、continue、let 和 shift 内建函数接受并处理以 - 开头的参数,而不需要 --。其他接受参数但未指定为接受选项的内置函数将以 - 开头的参数解释为无效选项,并需要 - 以防止这种解释。
请注意,echo 并不将 -- 解释为选项的结束。