每当某个命令需要使用多个选项时,我通常会将选项组合在一起。例如,如果我想使用tar
i 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(参数向量)为空。
正如您所看到的,如果一个参数有多个部分,由于参数处理的实现,它的所有部分都必须紧跟在该参数之后。