Linux shell中参数和选项的区别

16

我目前正在参加一门Unix / Linux入门课程,我们遇到了一个问题,我的教练和我并不同意。

cp -i file1 file2

关于上述命令哪些是正确的?

  • A. 只有一个实用程序
  • B. 有一个选项
  • C. 有三个参数
  • D. 将文件1复制为文件2,在出现覆盖之前会向用户发出警告
  • E. 以上全是正确的

我认为答案是E,即以上全都是正确的。但讲师认为答案是D

显然,ABD都是正确的。问题在于C以及-i标志是否既是选项又是参数。

我的逻辑是,所有选项都是参数,但并非所有参数都是选项,而且由于列表中有多个正确答案,所以按照多项选择题的传统,答案很可能是E,即以上全都是正确的。

我还没有找到明确的证据来解决这个问题,所以想请教一下大家。


1
你的逻辑是正确的。你的教练没有正确答案表吗?还是他准备了那个测试? - lanzz
9
这提供了一个重要的元课程:许多教师并不具备所教授学科的资格。在这门课及所有课程中请记住这一点。 - Kristopher Johnson
5个回答

10

我知道这是一个旧的帖子,但我想为任何可能遇到类似争议的人添加以下内容。

 $ ls -l junk
-rw-r--r-- 1 you     19 Sep 26 16:25 junk

"在命令行中跟随程序名称的字符串,例如上面示例中的-ljunk,称为程序的参数。参数通常是选项或要由命令使用的文件名。"


1
此外,IEEE Std 1003.1 2013版中的“12.1 实用程序参数语法”表明选项是参数。 - Jrican
这实际上应该被标记为正确答案。 - Slizzered
我同意并已更改答案。 - Mike Kelly

2
这里的手册页面中写道:

长选项(long options)的必选参数对于短选项(short options)也是必选的。

这似乎意味着,在特定的问题背景下,至少你不应该将选项视为参数。否则,这就变得非常递归和无意义。
我认为,对于大多数典型情况来说,讲师应该接受您的解释,因为这确实是在纠缠细节。

在我看来,这个问题不应该从特定的cp工具角度考虑,而应该从一般的shell命令行范例角度考虑。你有一个命令行,指定一个命令(cp,它可以是可执行文件或别名)和三个参数;对于shell(以及execv)来说,在选项和非选项参数之间没有区别。此外,即使您的推理是正确的,也不会排除答案__C__,答案__A__,__B__和__D__仍然是正确的,因此这个问题将没有一个确切的答案,并且应该被视为无效。 - lanzz
感谢所有的反馈。我希望这只是个例,接下来的学期不会充满这样的情况。自从我发布问题以来,我的一个同学找到了书的答案,并确认以上答案都是正确的。所以我不确定教练在想什么。除此之外,她一直很棒。这里的回答都很有道理,感谢大家的建议。 - Mike Kelly

0
嗯... 我个人喜欢区分选项和参数,但从技术上来说,您可以说选项就是参数。我认为你是正确的,但我认为你的教练选择 D 是因为他不想让你搞混它们。例如,以下命令等同于上面的命令...:
 ARG1="-i" ; ARG2="file1" ; ARG3="file2" ; cp $ARG1 $ARG2 $ARG3

 ARG1="-i" ; ARG2="file1" ; ARG3="file2" ; cp $ARG2 $ARG1 $ARG3

 ARG1="-i" ; ARG2="file1" ; ARG3="file2" ; cp $ARG2 $ARG3 $ARG1

然而,cp $ARG1 $ARG3 $ARG2 不同。我认为选项是一种特殊类型的参数。


0

这是我学习时的教导,据说在这种情况下应该这样做:

cp -i file1 file2

正确答案应该是A、B和D,但不包括C。

因为-i是选项,file1file2是参数。通常选项被认为可以改变应用程序或命令的行为,而参数则不会。

我想这取决于语义,你是否认为-i是原始应用程序的参数,因为它是cp的行为更改选项(或参数),但在英语中它被认为是选项而不是参数。

这就是我如何定义区分命令的两个部分的区别。

另一个命令的例子是cronjobs。我经常使用PHP cronjobs,并且通常将选项和参数与命令关联起来。选项总是用于定义额外的行为,而参数旨在为应用程序及其行为提供所需的数据以完成操作。

编辑

我同意@unwind的看法,这是在纠结琐事,实际上很多时候取决于场景和观点。他甚至标记它是相当糟糕的,他应该知道这是一个主观问题。当测试充满主观性问题时,完全不公平。


0

我认为术语“arguments”在不同的上下文中有不同的用法,这似乎是争议的根源。然而,支持你的立场的是,C运行时(很可能是cp所编写的)将程序入口点声明为main(argc, argv)(类型省略),这似乎至少表明设计C架构/库等的人认为选项是参数的一个子集。当然,选项可以有自己的参数(不同的上下文),等等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接