我可以在变量中指定重定向和管道吗?
时间: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
高温超导