我正在学习Linux。我很惊讶地发现在制作 tarball 时参数顺序似乎很重要。
tar -cfvz casual.tar.gz snapback.txt bucket.txt
给出错误:
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
但是如果我发出这样的命令:
tar -cvzf casual.tar.gz snapback.txt bucket.txt
tarball 已创建且没有错误
谁能向我解释为什么参数顺序在这个例子中很重要,或者我可以在哪里找到这些信息来了解为什么?我按照第一个示例中的方法进行了尝试,该示例收到一个错误,其逻辑是先放置所需的参数 c 和 f,然后再放置其他参数。
我想完全吸收Linux,其中包括理解为什么会发生这样的事情。提前致谢!
答案1
顺序是否重要取决于选项是否以减号开头
$ tar -cfvz casual.tar.gz snapback.txt bucket.txt
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ tar cfvz casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt
这种不寻常的行为记录在手册页
Options to GNU tar can be given in three different styles.
In traditional style
...
Any command line words that remain after all options has
been processed are treated as non-optional arguments: file or archive
member names.
...
tar cfv a.tar /etc
...
In UNIX or short-option style, each option letter is prefixed with a
single dash, as in other command line utilities. If an option takes
argument, the argument follows it, either as a separate command line
word, or immediately following the option.
...
tar -cvf a.tar /etc
...
In GNU or long-option style, each option begins with two dashes and
has a meaningful name
...
tar --create --file a.tar --verbose /etc
tar
,“tape archive”的缩写,在当前约定确定之前就已存在,因此它保留了不同的兼容性模式。
因此,为了“吸收 Linux”,我建议一些入门课程:
- 总是阅读手册页
- 语法上的微小差异有时很重要
- 项目的位置 - 大多数命令要求选项位于命令名称之后的第一个内容
- 是否需要减号(例如
tar
,ps
根据开头是否有减号而工作不同) - 空格是可选的、必需的还是不能存在(
xargs -ifoo
与 不同xargs -i foo
)
- 有些事情并没有按照你期望的方式进行
要以通常的方式获得您想要的行为,请将输出文件名直接放在 or 后面f
,-f
例如
$ tar -cvzf casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt
或者:
$ tar -c -f casual.tar.gz -z -v snapback.txt bucket.txt
或者你可以使用不太常见但更容易阅读的 GNU 长样式:
$ tar --create --verbose -gzip --file casual.tar.gz snapback.txt bucket.txt
答案2
检查-f
tar 手册页中的选项为我们提供:
-f, --file ARCHIVE use archive file or device ARCHIVE
这意味着该-f
选项后面的下一个单词将是文件名。在您的示例中,它后面-f
跟着字母vz
,这些字母将用作文件名。
之后,它解析每个参数作为其输入,以压缩到现在称为vz
.当它尝试这样做时,tar
会注意到没有具有casual.tar.gz
要压缩名称的文件,然后它会给出错误。
因此,在 后面-f
,它必须始终跟在您要生成的文件的名称之后。