焦油和头-1的组合不能按预期工作

DDD*_*XXX 1 bash pipeline tar

我正在编写一个脚本,需要解压缩文件,然后切换到使用cd注释解压缩的第一个文件夹.

我所做的是以下内容:

    filename_2=$(tar zxvf ${filename} | head -1) 
    cd $filename_2
Run Code Online (Sandbox Code Playgroud)

并按预期工作,但它不解压缩tar.gz文件中的所有文件,不知道为什么,因为如果我这样做:

    filename_2=$(tar zxvf ${filename}) 
Run Code Online (Sandbox Code Playgroud)

它将解压缩一切正常,但后来我不知道如何访问解压缩产生的第一个文件夹.

我不明白|管道如何影响以前的命令.

我究竟做错了什么?

谢谢.

L3v*_*han 5

因为head完成了,它会发出一个SIGPIPE信号tar,导致它停止.你需要缓冲stdout直到tar运行完毕,例如使用spongemoreutils:

filename_2=$(tar zxvf ${filename} | sponge | head -1)
Run Code Online (Sandbox Code Playgroud)

如果你没有海绵,tail高价值也一般有效:

filename_2=$(tar zxvf ${filename} | tail -n 10000000000 | head -1)
Run Code Online (Sandbox Code Playgroud)