Question

I have a bash script that creates a Subversion patch file for the current directory. I want to modify it to zip the produced file, if -z is given as an argument to the script.

Here's the relevant part:

zipped=''
zipcommand='>'

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

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

svn diff $zipcommand $filename

This doesn't work because it passes the | or > contained in $zipcommand as an argument to svn.

I can easily work around this, but the question is whether it's ever possible to use these kinds of operators when they're contained in variables.

Thanks!

Was it helpful?

Solution

I would do something like this (use bash -c or 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"

This appears to work, but my version of zip (Mac OS X) required that i change the line:

zipcommand='| zip -@'

to

zipcommand='| zip - - >'

Edit: incorporated @DanielBungert's suggestion to use eval

OTHER TIPS

eval is what you are looking for.

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

Be careful with quote characters on that.

Or you should try zsh shell whic allows to define global aliases, e.g.:

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

Then use this command (which is somewhat cryptic for the ones who took a look from behind ;-) )

./somecommand.sh S U L

HTH

Open a new file handle on either a process substitution to handle the compression or on the named file. Then redirect the output of svn diff to that file handle.

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top