我读过这行代码:
compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
有人能帮助我理解这个命令以及如何以其他方式编写此代码吗?
答案1
让我们分解一下这个命令。
compress_size_bzip2=anything
compress_size_bzip2
将所调用的 shell 变量(仅仅是一个名称,没有特殊含义)的值设置为anything
符号右边的值=
。anything
在我们的例子中是。$(command)
这是一个命令替换;此构造的值等于command
输出中写出的任何值。是
command
:bzip2 "$file" ; stat -c %s "$file.bz2"
,因此实际上是两个命令相继执行。第一个命令bzip2 "$file"
压缩文件名取自 shell 变量file
。如果文件名包含空格,则使用引号。通常此命令不会写入任何内容。第二个命令stat -c %s "$file.bz2"
输出文件名的大小,文件名为 shell 变量的值file
加上扩展名.bz2
。
因此,该大小是整体的输出command
,并且它被分配给变量compress_size_bzip2
。
例如,如果你将变量设置file
为要压缩的文件名,file=myfile.txt
然后运行上面的行,则会发生两件事:
- 文件
myfile.txt
将被压缩为myfile.txt.bz2
- 文件的大小
myfile.txt.bz2
将被赋给变量compress_size_bzip2
。您可以使用命令显示该值echo $compress_size_bzip2
。
答案2
-
bzip2 "$file"
这将对
bzip2
保存在变量“$file”中的文件名运行。bzip2
将文件压缩为名为 的新文件$file.bz2
。 -
stat -c %s "$file.bz2"
这
stat
在新创建的压缩上运行$file.bz2
:从
man stat
:stat - display file or file system status -c --format=FORMAT use the specified FORMAT instead of the default %s total size, in bytes
因此,该
stat
命令将返回新文件的文件大小(以字节为单位)。 -
$(some_command)
这就是所谓的命令替换
Bash 通过在子 shell 环境中执行命令并用命令的标准输出替换命令替换来执行扩展。
因此,
var=$(some_command)
节省了输出将 some_command 放入变量中var
。
总共:
compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
这将在子 shell 中运行bzip2
和stat
。子 shell 的输出是压缩文件的大小(以字节为单位),它将保存在变量 中$compress_size_bzip2
。
然而,仍有改进的空间:
您应该将子 shell 中的命令与 结合起来&&
,这样stat
只有在bzip2
成功时才会运行。
如果您不需要压缩文件,您应该使用标志bzip2
来告诉压缩到标准输出-c
,并使用wc -c
来告诉它的大小:
compress_size_bzip2=$(bzip2 -c "$file" | wc -c)