bash 脚本中的 Tar 存档列表

bash 脚本中的 Tar 存档列表

我有一个绑定到别名的函数,以便轻松列出档案。

function list-tar-archive {
  if [ "X$1" != 'X' ]; then
    out=tar -tf $1 | awk -F/ '{if (NF<3) print }'
    echo ${out}
  fi
}

alias list-tar='list-tar-archive'

当我使用别名时,为什么我得到“没有找到命令'-tf'”作为输出,有点困惑。

~/workspace$ list-tar bits-and-bytes-proj.tgz
No command '-tf' found, did you mean:
 Command 'gtf' from package 'xserver-xorg-core' (main)
 Command 'tf' from package 'tf' (universe)
 Command 'tf' from package 'tf5' (universe)
 Command 'wtf' from package 'bsdgames' (universe)
-tf: command not found

但...

~/workspace$ tar -tf bits-and-bytes-proj.tgz | awk -F/ '{if (NF<3) 
print }'
bits-and-bytes-proj/
**truncated**

???

答案1

out=tar -tf $1 | awk -F/ '{if (NF<3) print }'

-tf $1out环境变量设置为 的情况下运行tar

你实际上应该做的是:

list-tar() {
    if [[ $1 ]];then
        tar -tf "$1" | awk -F/ 'NF<3'
    fi
}

请注意程序的简化awk:默认操作是{print},所以我只是用作NF<3必须为 true 才能发生该操作的规则。 (规则不必是/regex/模式(默认匹配$0)。)对少于两个/字符的行使用简单的 grep 也可以达到目的。

另请注意,将输出捕获到 shell 变量中然后回显它是愚蠢的,除非您想用它做点什么。您的版本还会因文件名中含有空格而中断。 echo $out分词$out,然后 echo 以空格分隔多个参数。因此,多个空格会变成一个空格,并且您无法区分文件名中的空格和两个单独的文件之间的区别。

[[ $1 ]]是一种更好/更明显的编写方法[[ -n $1 ]]来测试非空 shell 变量。 这解释了[和之间的一些差异[[


Shell 函数可以作为命令运行,因此除非您有其他原因或命名方案,否则只需为函数指定短名称,而不必担心别名。

相关内容