Posso specificare reindirizzamenti e pipe in variabili?
-
02-07-2019 - |
Domanda
Ho uno script bash che crea un file patch Subversion per la directory corrente. Voglio modificarlo per comprimere il file prodotto, se -z
viene fornito come argomento per lo script.
Ecco la parte 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
Questo non funziona perché passa il |
o >
contenuto in $ zipcommand
come argomento a svn
.
Posso facilmente aggirare questo problema, ma la domanda è se è mai possibile utilizzare questo tipo di operatori quando sono contenuti in variabili.
Grazie!
Soluzione
Vorrei fare qualcosa del genere (usare bash -c o 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"
Sembra funzionare, ma la mia versione di zip (Mac OS X) mi ha richiesto di cambiare linea:
zipcommand='| zip -@'
a
zipcommand='| zip - - >'
Modifica: incorporato il suggerimento di @ DanielBungert di usare eval
Altri suggerimenti
eval è quello che stai cercando.
# eval 'printf "foo\nbar" | grep bar'
bar
Fai attenzione con i caratteri di citazione su questo.
Oppure dovresti provare zsh
shell che consente di definire alias globali, ad es .:
alias -g L='| less'
alias -g S='| sort'
alias -g U='| uniq -c'
Quindi usa questo comando (che è in qualche modo criptico per quelli che hanno dato un'occhiata da dietro ;-))
./somecommand.sh S U L
HTH
Apri un nuovo handle di file su una sostituzione di processo per gestire la compressione o sul file indicato. Quindi reindirizzare l'output di svn diff
sull'handle del file.
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