我正在编写一个处理日志文件的 shell 脚本。有时文件可能被压缩——并且文件名中有适当的后缀。
在这种情况下,我想将解压缩添加到文件处理管道中:
case "$file" in:
*.gz) READER="gzip -cd" ;;
*.bz2) READER="bzip2 -cd" ;;
...
*) READER="cat" ;;
esac
$READER < $file | processing
这可行,但我不喜欢它,因为当文件解压缩时,cat
它会被无用地调用。在这种情况下我想直接打开文件:
< $file processing
我尝试使用eval
并制作|
的一部分$READER
,但这弄乱了加工管道作为 eval 也适用于...
有什么建议么?
答案1
我的建议是,没有任何理由去关心猫的无用使用(“UUOC”)。
在这种情况下,它甚至不是“无用”的用途 -cat
作为默认过滤器具有非常有用的目的,这样您就不必编写额外的代码行来处理特殊情况。
不必要的复杂性是比 UUOC 更严重的编程“犯罪”。
顺便说一句,如果这cat
真的让你烦恼,你可以使用ucat
工具unp
集,避免重新发明轮子。 unp
似乎没有主页,但至少为 debian 和 ubuntu 打包了(目前由 debian 开发人员 Eduard Block 维护)。
Package: unp
Version: 2.0~pre7+nmu1
Installed-Size: 133
Maintainer: Eduard Bloch <[email protected]>
Architecture: all
Suggests: bzip2, unrar | unrar-free, xdms, p7zip | p7zip-full, unzip, cabextract,
orange
Description-en: unpack (almost) everything with one command
unp is a small perl script which makes extraction of any archive files
a bit easier. It support several compressors and archiver programs,
chooses the right one(s) automatically and extracts one or more files
in one go.
.
You may also want to install some non-free packages like "unace-nonfree",
"unrar-nonfree" and "lha" to extract archives of these types.