2015-02-18 2 views
2

я придумал эту командуОбновить все глобальные активированные пакеты

pub global list -v 2>/dev/null | awk '{split($0, a," "); printf \ 
    "pub global activate "; if(a[8]=="") printf a[3]; else printf \ 
    "-sgit " a[8]; print "" }' | xargs -0 bash -c 

обновить все мои глобально активированные пакеты.

pub global list -v 

выходы

FINE: Pub 1.9.0-edge.43835 
MSG : dart_style 0.1.3 
MSG : den 0.1.5 
MSG : linter 0.0.1 from Git repository "[email protected]:dart-lang/linter.git" 
MSG : polymer 0.15.5+1 
MSG : stagehand 0.1.5+4 
MSG : test_runner 0.2.16 

Приведенная выше команда генерирует эти команды с выхода

pub global activate dart_style 
... 
pub global activate -sgit "[email protected]:dart-lang/linter.git" 
... 

Это довольно сложно. Есть ли более простой способ?

+0

Я не думаю, что ручной раздельный вызов делает что-то для вас, поэтому вы можете его сбросить. Вы могли бы очистить awk немного больше от тройного оператора, но это не большая сделка/победа. Это звучит как-то, что вы должны обсудить с «pub», чтобы мне не было лучшего способа сделать это. Кроме того, команда awk не выплескивает строки с нулевым ограничением, так что вызов «xargs» не выглядит так, как будто он должен работать как написанный. –

+0

+ Etan Reisner Вот почему я добавил теги дротиков. Может быть, кто-то знает лучший способ без всех этих строковых манипуляций. Я понимаю тройственный аргумент, но не комментарий о линиях, связанных с NUL. Не могли бы вы объяснить немного больше? –

+2

Аргумент '-0' для' xargs' говорит: «Разделить ввод на NUL-байтах вместо строк новой строки», но ваш awk-скрипт выводит обычные строки с разделителями строк, поэтому «xargs» не разделяет его вообще. Хотя, теперь, когда я пишу это, это не имеет большого значения (за исключением того, что на самом деле не используется «xargs» вообще), поскольку bash все равно будет обрабатывать новые строки (но вы могли бы просто использовать '| bash - s' с этим вместо этого. –

ответ

3

Ну, вам не нужно применять split в awk.

Другой улучшиться, избавиться от if contional и использовать оператор ternary (как Этан объяснить в комментариях):

awk '{var=$8==""?$3:"-sgit "$8;print "pub global activate "var }' 

Конечный материал должен быть чем-то близко к:

pub global list -v 2>/dev/null |\ 
awk '{var= $8==""? $3: "-sgit " $8 
     print "pub global activate "var }'| bash -s 

В качестве альтернативы можно позвонить system внутри awk код:

pub global list -v 2>/dev/null |\ 
awk '{var=$8=="" ? $3: "-sgit " $8          
     cmd="pub global activate "var 
     system(cmd) 
     close(cmd)}' 
+0

As + Etan Reisner написал в вышеупомянутом комментарии.' | xargs -0' ничего не делает в этом случае. 'print" "' ('... $ 8; print" "}'), чтобы получить разрыв строки и сделать каждую строку выполненной на ее основе. –

+1

Ups @EtanReisner снова прав: Günter, см. Мой отредактированный ответ – klashxx

1

Как я не говорю bash или awk плавно и интересовался такой особенностью, я закончил тем, что написал этот инструмент ... в дротике (да, я знаю, что он не отвечает на вопрос, но вот где я приземлился при поиске такого признака)

$ pub global activate pubglobalupdate 

Тогда все текущие глобальные активированные пакеты могут быть обновлены с помощью:

$ pubglobalupdate 

он работает на Linux, Mac и Windows! (https://github.com/tekartik/pubglobalupdate.dart)

+1

Хорошо, я слушал вас. Пакет теперь находится в пабе (ответ обновлен) – alextk

Смежные вопросы