我可以在变量中指定重定向和管道吗?
时间:2020-03-06 14:40:54 来源:igfitidea点击:
我有一个bash脚本,可为当前目录创建Subversion补丁文件。如果将-z作为脚本的参数,我想对其进行压缩以压缩生成的文件。
这是相关的部分:
zipped=''
zipcommand='>'
if [ "" = "-z" ]
then
zipped='zipped '
filename="${filename}.zip"
zipcommand='| zip >'
fi
echo "Creating ${zipped}patch file $filename..."
svn diff $zipcommand $filename
这是行不通的,因为它将$ zipcommand中包含的|或者>作为参数传递给svn。
我可以轻松解决此问题,但问题是,当这些运算符包含在变量中时,是否有可能使用它们呢?
谢谢!
解决方案
我会做这样的事情(使用bash -c或者eval):
zipped=''
zipcommand='>'
if [ "" = "-z" ]
then
zipped='zipped '
filename="${filename}.zip"
zipcommand='| zip -@'
fi
echo "Creating ${zipped}patch file $filename..."
eval "svn diff $zipcommand $filename"
# this also works:
# bash -c "svn diff $zipcommand $filename"
这似乎可行,但是我的zip版本(Mac OS X)要求我更改以下行:
zipcommand='| zip -@'
到
zipcommand='| zip - - >'
编辑:合并@DanielBungert的建议使用eval
评估是我们想要的。
# eval 'printf "foo\nbar" | grep bar' bar
请谨慎使用引号字符。
或者我们应该尝试使用zsh shell允许定义全局别名的示例,例如:
alias -g L='| less' alias -g S='| sort' alias -g U='| uniq -c'
然后使用此命令(对于那些从后面看一看的人来说,这有点神秘;)
./somecommand.sh S U L
高温超导

