Как объединить "$@" или массив в одну строку

Общий формат
# emerge -optionswithnospaces category/package-name-version-x.y.z

Выпуск

Вы перепутали, пакет с категорией, которую я редактировал. Это приводит к ответу на ваш вопрос. Emergeсам по себе не может создавать пакеты, используя подстановочные знаки категории,поскольку средство проверки зависимостей ожидает хотя бы один пакет.

Решение

Это оставляет нам два варианта:

  1. Написать For Next BASH Loop . Для этого требуется app-portage/portage-utils. Что-то близкое к emerge -av $(for name in $(qlist -IC | grep -v '^games-rpg/') etc etcЛично я ненавижу этот метод, так как мне требуется время на его отладку. На этой бирже есть несколько отличных скрипторов, если вы решите пойти по этому пути.
  2. Создайте пользовательский набор пакетов . Это требует немного утомительной работы, так как вы должны вручную добавлять каждый пакет в категорию, если вы не хотите, чтобы что-то из категории было установлено, или вы действительно можете использовать то, что вы обнаружили.

nano -w /etc/portage/sets/rpg-games

Добавьте следующее:

games-rpg/*

А потомemerge -av @rpg-games

Portage может расширить подстановочный знак, если подстановочный знак указан в наборе. Я считаю, что это работает с помощью буферной магии, но не цитируйте меня по этому поводу. Оболочка emerge разветвляет временный файл, перечисляет все элементы, выбранные подстановочным знаком, собирает список и отправляет его в качестве входных данных, а затем закрывает временный файл.


Чтобы узнать больше о подстановочных знаках и Portage, прочитайте раздел ГЛОССАРИЙ в man portage. Вот онлайн-копия .

1
04.01.2021, 10:45
2 ответа

В Korn/POSIX -как оболочки, а "$@"расширяется до всех позиционных параметров, разделенных (в контекстах списка ), "$*"расширяется до конкатенации позиционных параметров с первым символом (байт с некоторыми оболочками )из $IFS¹ или с SPC, если $IFSне установлено, или без ничего, если $IFSустановлено на пустую строку.

И в ksh/ zsh/ bash/yash(Bourne -как оболочки с поддержкой массива ), это то же самое для "${array[@]}"против "${array[*]}".

В zsh"$array"совпадает с "${array[*]}", а в ksh/bashсовпадает с "${array[0]}". В yashэто то же самое, что и "${array[@]}".

В zshвы можете соединять элементы массива с произвольными разделителями с флагом раскрытия параметра j:"${(j[ ])array}", например, для соединения по пробелу. Это не ограничивается строками из одного символа / байта, вы также можете, например, "${(j[ and ])array}"и использовать флаг расширения параметра p, чтобы иметь возможность использовать escape-последовательности или переменные в спецификации разделителя (, например "${(pj[\t])array}"для соединения на TAB и "${(pj[$var])array}", чтобы присоединиться к содержимому$var). См. также флаг быстрого доступа F(, такой же, как pj[\n]), для соединения с переводом строки -.

Так вот:

ores_simple_push() (
  set -o errexit -o pipefail
  git add.
  git add -A

  args=("$@")

  if [[ ${#args[@]} -lt 1 ]]; then
      args+=('squash-this-commit')
  fi

  IFS=' '
  git commit -am "${args[*]}" || true
  git push
)

Или просто POSIXly:

ores_simple_push() (
  set -o errexit
  git add.
  git add -A

  [ "$#" -gt 0 ] || set square-this-commit

  IFS=' '
  git commit -am "$*" || true
  git push
)

С некоторыми оболочками (, включая bash, ksh93, mksh и bosh, но не с dash, zsh и yash ), здесь также можно использовать "${*-square-this-commit}".

Для полноты, в bash, для объединения массивов с произвольными строками (для эквивалента zshjoined=${(ps[$sep])array})вы можете сделать:

IFS=
joined="${array[*]/#/$sep}"
joined=${joined#"$sep"}

(предполагается, что $sepявляется допустимым текстом в локали; если нет, есть шанс, что второй шаг завершится ошибкой, если содержимое $sepв конечном итоге сформирует допустимый текст при объединении с остальными ).


¹ Историческая справка: в оболочке Борнаони были объединены с SPC независимо от значения$IFS

5
18.03.2021, 22:38

На самом деле это работает, но я не знаю, почему:

  git commit -am "${args}" || { echo; }
-1
18.03.2021, 22:38

Теги

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