我有一个绑定到别名的函数,以便轻松列出档案。
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 $1
在out
环境变量设置为 的情况下运行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 函数可以作为命令运行,因此除非您有其他原因或命名方案,否则只需为函数指定短名称,而不必担心别名。