4

我有一个 bash 脚本,它为当前目录创建一个 Subversion 补丁文件。-z如果作为脚本的参数给出,我想修改它以压缩生成的文件。

这是相关部分:

zipped=''
zipcommand='>'

if [ "$1" = "-z" ]
then
   zipped='zipped '
   filename="${filename}.zip"
   zipcommand='| zip >'
fi

echo "Creating ${zipped}patch file $filename..."

svn diff $zipcommand $filename

这不起作用,因为它将or|作为参数传递给.>$zipcommandsvn

我可以轻松解决这个问题,但问题是当它们包含在变量中时是否可以使用这些类型的运算符。

谢谢!

4

4 回答 4

5

我会做这样的事情(使用 bash -c 或 eval):

zipped=''
zipcommand='>'

if [ "$1" = "-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 的建议

于 2008-09-24T18:59:16.960 回答
2

eval 是您正在寻找的。

# eval 'printf "foo\nbar" | grep bar'
bar

小心使用引号字符。

于 2008-09-24T19:01:13.743 回答
0

或者您应该尝试zsh允许定义全局别名的 shell,例如:

alias -g L='| less'
alias -g S='| sort'
alias -g U='| uniq -c'

然后使用这个命令(对于那些从后面看的人来说有点神秘;-))

./somecommand.sh S U L

高温高压

于 2008-09-25T09:09:47.790 回答
0

在处理压缩的进程替换或命名文件上打开一个新的文件句柄。然后将输出重定向svn diff到该文件句柄。

if [ "$1" = "-z" ]; then
    zipped='zipped '
    filename=$filename.zip
    exec 3> >(zip > "$filename")
else
    exec 3> "$filename"
fi

echo "Creating ${zipped}patch file $filename"
svn diff >&3
于 2015-10-30T03:28:54.117 回答