2013-02-21 3 views
1

Я пытался создать быстрый скрипт, чтобы найти все репозитории git в каталоге и последовательно «git pull» каждый.Передача команд подоболочке с xargs не работает внутри псевдонима

Это то, что я нашел до сих пор:

find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'cd "$1" && git pull' _ 

Если вставить в терминал, это будет работать точно так, как это задумано. Однако, если я делаю это в качестве псевдонима в моем .bashrc файле:

alias gpa="find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'cd "$1" && git pull' _" 

Команда не работает. Я изменил его в попытке заставить его напечатать, что подоболочка запущен xargs получает:

alias printgpa="find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'echo "$1"' _" 

При запуске каждой подоболочка печатает новую строку, но ничего другого.

Может кто-нибудь ответить, почему это происходит? Чувство моего чувства говорит, что это проблема с моим синтаксисом в псевдониме, но я точно не знаю, что происходит.

+0

'установить -x' в Баш будет заставить его повторить команды, как он видит их, перед их исполнением. Отлично подходит для выяснения сложных проблем с цитированием. – bobbogo

+0

Возможно, вы захотите использовать функцию вместо псевдонима, так что вам не нужно беспокоиться о хитрой цитате, чтобы заставить ее работать. – chepner

ответ

2

Проблема заключается в том, что $1 подменяется при определении псевдонима, а не при его запуске. Чтобы этого избежать, вам нужно указать $ либо с помощью обратной косой черты, либо с помощью отдельных кавычек. Например:

alias printgpa='find ~/ -name .git -type d | sed '\''s,/*[^/]\+/*$,,'\'' | xargs -L1 bash -c '\''echo "$1"'\'' _' 
+1

Отличный! Большое вам спасибо, это прекрасно работает. Мой псевдоним теперь говорит: 'alias gpa =" find ~/-name ".git" -тип d | sed 's,/* [^ /] \ +/* $ ,,' | xargs -L1 bash - c 'cd "\ $ 1" && git pull' _ "' – lelandbatey

+0

@lelandbatey: Добро пожаловать! – ruakh

+0

@MartijnPieters: хороший ответ. ОП не принял его, однако +1 от меня. – user1284631

2

Может быть, это легче читать, когда вы используете GNU Parallel:

alias gpa="find ~/ -name .git -type d | parallel 'cd {//} && git pull'" 

Кроме того, вы получаете дополнительное преимущество получения более мерзавцев тянуть параллельно.

Это занимает буквально 10 секунд, чтобы установить GNU Parallel:

wget pi.dk/3 -qO - | sh -x 

Смотреть интро видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+1

+1 для параллелизма, но при запуске скрипта для установки инструмента, который часто просто доступен, ваш репозиторий программного обеспечения ОС немного портится. Я не уверен, что это хорошая идея, чтобы побуждать людей выполнять сценарии таким образом. – JeroenHoek

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