Unix 中 shell 传递给命令的参数

Unix 中 shell 传递给命令的参数

我一直在思考这个问题,但我无论如何也想不出为什么答案是这样的。在这个命令行上,shell 向命令传递了多少个参数:
<pig pig -x " " -z -r" " >pig pig pig
a. 8 b. 6 c. 5 d. 7 e. 9
第一个符号应该是重定向输入的符号,但网站不允许我使用它。[已修复。]
我看了看这个问题,说好吧……参数……不是选项,所以第二只猪,然后是“”,然后是 -r“”,第四只猪和第五只猪……-z 和 -x 是选项,所以我数了 5。答案是 b. 6。传递的第 6 个参数在哪里?

答案1

我认为您在什么才算是一个论点的语义问题上遇到了麻烦。

在命令行级别,选项是命令恰好要特殊对待的参数。(更具体地说:它们包含在传递给命令的 argv 数组中。)因此,根据“参数”的确切含义,它们可能会或可能不会包含在计数中。我怀疑它们被包括在内,但第二个“pig”没有(因为它是命令名,它不是一个参数)(好吧,好吧,它也包含在 argv 中,但是不算)(大部分情况下)。

为了说明我关于选项是特殊处理的参数的意思(以及区别的任意性),请考虑以下命令:

tar cv -f foo.tar bar
  • tar是命令
  • cv是两个选项(create 和 verbose)。我知道它看起来不像,但tar早于一致使用-来引入选项,并且会将其第一个“参数”视为一个或多个选项,即使它不是以-
  • -f foo.tar是另一种选择,它是参数(不同于一般命令参数)
  • bar是一个正常的命令参数(终于!)

请注意,这两个命令与上面的命令等效:

tar cvf foo.tar bar
tar cv -ffoo.tar bar

答案2

传递给程序的参数pig是:

  1. -X
  2. “ “
  3. -z
  4. -r“ -r”
  5. 倒数第二头猪
  6. 最后一只猪

从编程角度来看,通常将所有内容argv(除了argv[0])视为程序的参数。这包括“选项”标记——我的意思是,如果程序根本不采用任何选项,而是将“-x”之类的内容视为文件名,会怎么样?

相关内容