2014-11-05 4 views
2

[Примечание. Я решил проблему, с которой столкнулся, используя функцию bash, но я хочу понять, почему моя первоначальная попытка не сработала.]bash - как * интерпретируется в псевдонимах?

Я запускаю git в Windows и использую приложение командной строки Git Bash для управления репозиториями. У меня есть несколько репозиториев, которые я часто хочу вытащить сразу. Раньше я делал это, введя в командной строке:

for i in *; do cd $i; git pull --rebase; cd ..; done; 

Чтобы сэкономить время, я решил создать псевдоним для этого. Итак, я создал файл .bashrc в домашнем каталоге (C:/мерзавец в моем случае) и добавил строку

alias pr="for i in *; do cd $i; git pull --rebase; cd ..; done;" 

Однако, это не работает вообще, выход был

sh.exe" cd: /etc/profile.d/*.sh: No such file or directory 

, за которым следует git, жалуясь, что он не находится в репозитории. Результат будет повторяться более 20 раз для одного вызова. Корень файловой системы MinGW, где происходит из/etc выше, - это то, где я установил git в (C:/Program Files (x86)/Git).

Теперь я решил эту проблему, в конце концов, создав функцию в моем файле .bashrc вместо этого, например, так:

pr(){ 
    for i in * 
    do 
     cd $i 
     git pull --rebase 
     cd .. 
    done 
} 

Итак, моя проблема решена, но я хочу, чтобы понять, почему мой первоначальный подход не работает. Очевидно, что-то в псевдонимах, которые я не понимаю, это, по-видимому, искажение бит «i in *». Мое предположение состояло в том, что bash заменит строку картами псевдонимов, а затем оценит ее, но это, похоже, не так просто.

+2

Что произойдет, если вы добавите 'echo 'i = $ i" 'прямо перед назначением и переименованием' pr'? – BroSlow

+2

Кроме того, вы, вероятно, захотите сделать его короткозамкнутым условным 'cd '$ i" && git pull --rebase && cd ..'. В противном случае вы можете получить некоторые странные результаты ('$ i' не является каталогом, но вы все еще запускаете' git' и поднимаетесь на уровень и т. Д.) – BroSlow

+0

Возможный дубликат команды [bash alias с одиночными и двойными кавычками] (http://stackoverflow.com/questions/20111063/bash-alias-command-with-both-single-and-double-quotes) – tripleee

ответ

6

Я не проанализировал это полностью, но это связано с тем, как ваш $i в псевдониме расширяется. То, как вы это делаете, $i, вероятно, будет инициализировано во время создания псевдонима. В версии функции она будет интерпретироваться во время выполнения. Попробуйте определение псевдонима, как вы показали, а затем запустить:

alias pr # show how the alias is defined 

Bash будет счастливо отложить расширение $ -variables если определить псевдоним одинарных кавычек. Следующее должно работать так же, как и ваша функция.

alias pr='for i in *; do cd $i; git pull --rebase; cd ..; done;' 
+1

Кто-то, пожалуйста, объясните '-1' – BroSlow

+0

+1 Это абсолютно правильно; «$ i» внутри двойных кавычек был расширен до того, как был определен псевдоним. Расширение параметров не выполняется внутри одинарных кавычек или (как обнаружено OP) в теле функции, когда функция определена. – chepner

+0

Ага, похоже, ты прав. 'alias pr' дает следующий результат: ' alias pr = 'для i in *; do cd /etc/profile.d/*.sh; git pull --rebase; CD ..; done; '' Так что это проблема с расширением' $ i', а не, как я думал, что-то связанное с '*'. Я проверял, что он работает с одинарными кавычками. – Jenesis

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