2008-09-24 3 views
4

J'ai un script bash qui crée un fichier de correctif Subversion pour le répertoire en cours. Je veux le modifier pour compresser le fichier produit, si -z est donné comme argument au script.Puis-je spécifier des redirections et des tubes dans des variables?

est ici la partie pertinente:

zipped='' 
zipcommand='>' 

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

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

svn diff $zipcommand $filename 

Cela ne fonctionne pas parce qu'il passe le | ou > contenus dans $zipcommand comme argument pour svn.

Je peux facilement contourner ce problème, mais la question est de savoir s'il est toujours possible d'utiliser ce type d'opérateurs lorsqu'ils sont contenus dans des variables.

Merci!

Répondre

5

je ferais quelque chose comme ça (utilisez bash -c ou eval):

zipped='' 
zipcommand='>' 

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

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

eval "svn diff $zipcommand $filename" 
# this also works: 
# bash -c "svn diff $zipcommand $filename" 

Cela semble fonctionner, mais ma version de zip (Mac OS X) a exigé que je change la ligne:

à

zipcommand='| zip - - >' 

Edit: incorporé @ suggestion de DanielBungert à utiliser eval

+0

Merci! Et oui, j'ai eu les mauvais arguments zip à l'origine, comme je l'avais adapté à partir d'un script qui redirigeait les fichiers donnés par "svn status" dans "zip - @" qui lit les noms de fichiers de stdin. – Owen

2

eval est ce que vous cherchez.

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

Soyez prudent avec les guillemets.

0

Ou vous devriez essayer shell zsh WHIC permet de définir des alias globaux, par exemple:

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

Ensuite, utilisez cette commande (qui est un peu cryptique pour ceux qui ont un regard derrière ;-))

./somecommand.sh S U L 

HTH

0

Ouvrir un nouveau descripteur de fichier soit sur une substitution de processus pour gérer la compression ou sur le fichier nommé. Ensuite, redirigez la sortie de svn diff vers cette poignée de fichier.

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 
Questions connexes