Понимание $() (и циклов for) в bash [дубликат]

0
18.09.2019, 12:07
1 ответ

Когда $(git branch)расширяется для цикла for, чтобы зациклиться на нем, он расширяется до многострочной строки -

  branch1
* branch2
  master

Поскольку подстановка команды не заключена в кавычки, она затем разбивается на пробелы, табуляции и новые строки (по умолчанию )на четыре слова

branch1 * branch2 master

Каждое слово затем подвергается генерации имени файла (подстановке ). Второе слово, *, будет заменено всеми (не -скрытыми )именами файлов в вашем текущем каталоге. Похоже, это имя одного файла только в вашем случае, README.txt.

Таким образом, окончательный список, по которому будет проходить цикл, будет

branch1 README.txt branch2 master

Вместо этого, если вы хотите просто вывести это в скрипт, используйте

git branch

ничего больше не делая.

Если вы хотите сохранить вывод в переменной, используйте

branches=$( git branch )

Вы хотите получить имя текущей ветки, а затем извлечь ветку, имя которой предшествует*:

curr_branch=$( git branch | awk '/^\*/ { print $2 }' )

Если вы хотите перебрать вывод git branch, используйте цикл while:

git branch |
while read -r star name; do
    if [ -z "$name" ]; then
        name=$star
        printf 'One branch is "%s"\n' "$name"
    else
        printf 'The current branch is "%s"\n' "$name"
    fi
done

Вы также можете использовать git branch --show-currentдля прямого получения имени текущей ветки.

2
28.01.2020, 02:30

Теги

Похожие вопросы