hee*_*ayl 32
一般来说:
-
表示从 STDIN(文件描述符 0)读取参数/内容
--
表示命令选项结束,后面的所有内容都是参数
为什么需要:
关于-
:
$ echo foobar | cat -
foobar
Run Code Online (Sandbox Code Playgroud)
尽管cat
可以在不需要 的情况下从 STDIN 读取内容,但-
许多命令都需要它,并且它们的man
页面明确提到了这一点。
现在关于 --
,我已经创建了一个文件-spam
,让我们来看看cat
这个文件:
$ echo foobar >-spam
$ cat -spam
cat: invalid option -- 'p'
Try 'cat --help' for more information.
$ cat -- -spam
foobar
Run Code Online (Sandbox Code Playgroud)
没有--
,cat
需要s
, p
, a
,m
所有作为它们跟随的选项-
,--
明确指示选项的结束, 之后-spam
作为文件名.
Rin*_*ind 28
--
是长名字版本-
是简称版本看一下 man ls
和一些选项:
-a, --all : do not ignore entries starting with .
-A, --almost-all : do not list implied . and ..
-b, --escape : print C-style escapes for nongraphic characters
-B, --ignore-backups : do not list implied entries ending with ~
Run Code Online (Sandbox Code Playgroud)
它们是相同的,但有些更喜欢短版,有些更喜欢长版。
两者都是为了兼容性。删除选项会破坏软件。
并非每个命令都遵循这一点。正如@ Bakuriu 在评论中提到的:一个命令find
具有您可以考虑的带有 1 个连字符的“长名称”。
关于编码,还有一些需要注意的地方:
这实际上取决于有关的程序。有标准,但实际上并没有强制执行任何地方:这取决于每个程序来实施它们。
find
例如,该命令采用带单个连字符的全名参数:
find . -iname "*.jpg" -delete
Run Code Online (Sandbox Code Playgroud)
但是,一般情况下,双连字符表示开关是一个完整的单词,单连字符表示开关是单个字母。并且可以组合单字母开关,这意味着以下所有命令都是等效的:
cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to
Run Code Online (Sandbox Code Playgroud)
双连字符后跟一个空格也可用于表示“这是命令的结尾;后面的所有内容都是文件名,即使它看起来像命令”。
并且没有以下字母的单个连字符可以表示“从标准输入读取,而不是从文件读取”。
然而,所有这些都是依赖于程序的。任何给定的程序都可能违反这些标准中的任何一个,例如,使用find
.