组合命令的不同选项时的正确顺序

组合命令的不同选项时的正确顺序

每当某个命令需要使用多个选项时,我通常会将选项组合在一起。例如,如果我想使用tari will write创建一个存档tar -cvf archive.tar file1 file2,但我的疑问是如何知道我必须将选项组合在一起的正确顺序。如果我使用tar -cfv archive.tar file1 file2它会显示错误。我在使用许多其他命令时也遇到过这个问题。我知道这是一个非常愚蠢的怀疑,但我真的很难克服它。我还检查了man命令的描述,但他们在概要部分下指定了特定的顺序。我无法找到与按特定顺序组合选项相关的内容。

答案1

任何给定命令的手册将准确描述如何使用其选项。

在这种情况下,该-f选项采用文件名参数。选项的参数(如果需要一个)必须就放在它之后。在第一个tar命令中,此文件名参数是archive.tar,但在第二个命令中是v

第二个命令尝试创建一个v由三个文件archive.tar file1、 和调用的存档file2。由于archive.tar可能不存在,您将收到有关此的错误消息。

同样,tar手册会对此进行描述。 GNUtar手册说

tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

所以很明显它-f采用了档案的名称。再往下一点,它说

-f,--file=ARCHIVE

使用归档文件或设备ARCHIVE。 [...]

您使用的其他选项-c-v不带参数。

另外,一般来说,选项位于文件操作数之前。一些 GNU 工具允许您将选项添加到命令行的最后,例如

tar -c -f archive.tar file1 file2 -v

但这是(恕我直言)糟糕的风格,并且它会在许多其他 Unices 上崩溃(-v将被解释为文件名)。

tar按照概要中的形式编写命令的 100% 正确方法是

tar -c -f archive.tar -v file1 file2

答案2

这个问题通常与需要以下参数的选项有关。让我们以 tar 为例。
-f需要文件名,因此后面必须跟有文件名。

伪代码中参数解析的一般形式可能有助于说明这一点:请记住,参数作为向量提供给命令(-cvf文件将被分解为argv[0]=c argv[1]=v argv[2]=f argv[3]=file

While $argv is not empty
do
   case $argv[0] in # argv[0] is pointer to leftmost, or first, arg
       c) # single element argument
          set internal variable create_mode=true
          shift # remove argv[0], shifting all indexes down by 1, so argv[0] now points to former argv[1]
       f) # A double element argument
          set internal variable use_file=true
          shift
          set internal variable file_name=$argv[0] # We did a shift, so now argv[0] points to the argument following 'f'
          shift
       v) # Another single element argument 
          set internal variable verbose=true
          shift
      # and so on, there is a case for each possible argument, and shifts according to the number of elements in each argument
done 

循环将继续处理 argv 中的每个参数,直到 argv(参数向量)为空。
正如您所看到的,如果一个参数有多个部分,由于参数处理的实现,它的所有部分都必须紧跟在该参数之后。

相关内容