我可以在变量中指定重定向和管道吗?

时间: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

高温超导