我读过这行代码:
compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
Run Code Online (Sandbox Code Playgroud)
谁能帮助我理解这个命令以及如何以其他方式编写这段代码?
raj*_*raj 12
让我们分解一下这个命令。
compress_size_bzip2=anythingcompress_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.bz2myfile.txt.bz2将被分配给变量compress_size_bzip2。您可以使用命令显示该值echo $compress_size_bzip2。bzip2 "$file"
Run Code Online (Sandbox Code Playgroud)
这将bzip2在变量“$file”中保存的文件名上运行。bzip2会将文件压缩到一个名为$file.bz2.
stat -c %s "$file.bz2"
Run Code Online (Sandbox Code Playgroud)
stat这在新创建的 compress 上运行$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
Run Code Online (Sandbox Code Playgroud)
因此,此stat命令将返回新文件的文件大小(以字节为单位)。
stat - display file or file system status
-c --format=FORMAT
use the specified FORMAT instead of the default
%s total size, in bytes
Run Code Online (Sandbox Code Playgroud)
这称为命令替换
Bash 通过在子 shell 环境中执行命令并将命令替换替换为命令的标准输出来执行扩展。
因此,var=$(some_command)将some_command 的输出保存到变量中var。
总共:
$(some_command)
Run Code Online (Sandbox Code Playgroud)
它bzip2在stat子 shell 中运行。子shell的输出是压缩文件的大小(以字节为单位),它将保存在变量中$compress_size_bzip2。
然而,还有改进的空间:
您应该将子 shell 中的命令与 结合起来&&,以便仅在成功stat时运行。bzip2
如果你不需要压缩文件,你应该bzip2用标志告诉压缩到标准输出-c,并使用wc -c告诉它的大小:
compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")
Run Code Online (Sandbox Code Playgroud)