为什么使用多余的破折号(-)将选项标志传递给tar?


35

要创建一个目录tar文件时,tar用命令compressverbosefile选择由此可以键入:

$ tar -cvf my.tar my_directory/

但这也可以通过以下方式实现:

 $ tar cvf my.tar my_directory/

也就是说,选项前没有破折号(-)。为什么要在选项列表中加上破折号(-)?


Answers:


43

UNIX应用程序历来使用的选项有几种不同的模式。几个老版本(例如tar)使用位置方案:

命令选项参数

例如tar使用

tar *某物* f “正在操作文件” *“要操纵的文件路径” *

为了避免混淆,tar和其他一些带有旧标志参数样式的程序允许使用破折号来分隔标志,但是我们大多数人只是忽略了这一点。

其他一些命令具有更复杂的命令行语法,例如dd(1),它使用标志,等号,路径名,自变量和梨树中的ridge,而所有这些都被遗弃了。

在BSD和更高版本的unix中,这或多或少都收敛于标有'-'的单字符标志,但这开始出现了两个问题:

  • 旗帜可能很难记住
  • 有时您实际上想使用带有-的名称
  • 尤其是使用GNU工具时,可能的标志数量开始受到限制。因此,GNU工具添加了GNU长选项,例如--output

然后,Sun决定多余的“-”是多余的,并开始使用带有单个“-”的长型标志。

这就是现在的混乱。


9
“还有梨树上的part”比我干的尝试更好。你赢了。
2011年

1
美好的历史背景。

1
我注意到许多X程序(包括Xorg的X)都使用带有单个的长型标志-。是太阳来的吗
mattdm

1
“梨树上的part”的意思是什么?(我可以有任何有用且易于理解的链接吗?)
plhn 2016年

1
@plhn成语。传统的英语圣诞节颂歌“圣诞节的十二天”列出了一大堆奢侈的礼物,结尾是“梨树上的part”。这表明清单很长。
查理·马丁

8

您可以以标准的unix方式提供tar选项tar -c -f foo -v -B file1 file2 file3,您需要使用破折号来区分选项和参数或命令行末尾的文件名。或者,您可以将所有选项放在第一个参数中,在这种情况下,破折号是可选的。

然后是ps,如果您使用的是SysV-ish选项,请在其中使用破折号;如果您使用的是BSD-ish选项,请在其中使用破折号,以使事情更加混乱。

并且甚至不谈论find


2

破折号用于区分选项参数名称和值。我想这更多是一个标准约定。


1
我要添加best-practice标签,因为我认为它可能归结于此。

1
@Milktrader,在谈论最佳实践时,这是一个难题。遵循标准约定确实是最佳实践,但是尚不清楚是否要根据实际情况进行。这将取决于您的情况。如果您要在Shell中破解一些快速命令,则可能不太在意,但是如果您正在编写库,则遵循完善的约定很重要,因为您无法控制该库的使用方式由客户。在这种情况下,您应该涵盖所有可能的情况,并且在选项名称和值之间进行歧义很重要。

-1

使用unix命令行选项最多有四个约定:

  1. -o -p -t (每个选项前的破折号)
  2. -opt (一组选项前的破折号)
  3. opt (在一组选项前没有破折号)
  4. --long-option (选项名称前的双破折号)

例如:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
该约定仅适用于tar吗?那ls呢?ls lrt不能工作,但是ls -lrt / ls -l -r -t可以工作。为什么这样?
Shashank Vyas

这四个约定应适用于所有命令。
jonasjacek

2
不,他们没有。前几天,我尝试了rm rf <filename>,那也行不通。
Shashank Vyas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.