Могу ли я указать перенаправления и каналы в переменных? - PullRequest
4 голосов
/ 24 сентября 2008

У меня есть скрипт 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

Это не работает, потому что оно передает | или >, содержащиеся в $zipcommand, в качестве аргумента svn.

Я легко могу обойти это, но вопрос в том, возможно ли когда-либо использовать такого рода операторы, когда они содержатся в переменных.

Спасибо!

Ответы [ 4 ]

5 голосов
/ 24 сентября 2008

Я бы сделал что-то вроде этого (используйте 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

2 голосов
/ 24 сентября 2008

Eval - это то, что вы ищете.

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

Будьте осторожны с кавычками.

0 голосов
/ 30 октября 2015

Открыть новый дескриптор файла в подстановке процесса для обработки сжатия или в именованном файле. Затем перенаправьте вывод 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
0 голосов
/ 25 сентября 2008

Или вы должны попробовать zsh shell, который позволяет определять глобальные псевдонимы, например ::

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

Затем используйте эту команду (которая несколько загадочна для тех, кто посмотрел сзади ;-))

./somecommand.sh S U L

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...