Сценарий оболочки для поиска списка ключей внутри ключа в файле Yaml

&>>является правильным синтаксисом в оболочке bashдля перенаправления как стандартного потока вывода, так и стандартного потока ошибок в файл в режиме добавления.

Я думаю, что может произойти то, что вы запускаете сценарий, используя sh, который в вашей системе не bash. Или вы используете версию bashболее раннюю, чем версия 4.0, которая является первой версией, поддерживающей &>>.

Другой способ сделать это, соответствующий стандарту, — использовать >>file 2>&1. В вашем случае

nohup "$@" >>"$nohup_file" 2>&1

Не существует более короткого способа сделать это в стандартной shоболочке.

Обратите внимание, что то, что вы предлагаете, 2>&1 >>file, находится задом наперед и не будет отправлять стандартный поток ошибок в файл, а туда, куда первоначально направлялся стандартный поток вывода . Перенаправления обрабатываются слева -на -справа, поэтому ваше перенаправление сначала отправит стандартную ошибку туда, куда идет стандартный вывод, а , а затем перенаправит стандартный вывод в файл. в режиме добавления. Другими словами, :второе перенаправление, >>fileне изменило бы направление стандартной ошибки, поэтому оно идет туда, куда изначально направлялся стандартный вывод из-за предыдущего 2>&1.


Альтернативным способом написания кода может быть

nohup_ntrs () {
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")"

  {
    printf ' ------------- BEGIN %s -------------- \n' "$(date)"
    nohup "$@"
    printf ' ------------- END %s ---------------- \n' "$(date)"
  } >>"$nohup_file" 2>&1
}

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

0
18.08.2021, 21:11
2 ответа

Это МОЖЕТ быть тем, что вы пытаетесь сделать, используя любой awk в любой оболочке на каждой машине Unix:

$ awk '!/^ /{f=/^paths:/} f && /^  \//{cnt++} END{print cnt+0}' file
3

В основном это зависит от того, что вы подразумеваете под «ключом».

1
20.08.2021, 10:24

Предполагая, что под «количеством ключей под paths» вы подразумеваете количество записей верхнего -уровня в разделе paths(, а не общее количество ключей, которое будет 12 ). В конце ответа я покажу, как вместо этого подсчитать количество tagsзаписей.

Использование yqизhttps://kislyuk.github.io/yq/:

yq '.paths|length' file.yml

Вывод будет 3для вашего примера документа.

Выражение .paths|lengthпередает массив pathsв функцию length. Функция возвращает длину массива.

Чтобы получить это число в переменной оболочки, используйте простую подстановку команд:

number_of_paths=$( yq '.paths|length' file.yml )

Если вместо этого вам нужна сумма количества tagsзаписей (, которая может быть намного больше, чем записи в массиве верхнего -уровня paths):

yq '[.paths[].post.tags | length ] | add' file.yml

Аналогичным образом, используя yqизhttps://mikefarah.gitbook.io/yq/:

yq eval '.paths|length' file.yml

или, для сохранения в переменной,

number_of_paths=$( yq eval '.paths|length' file.yml )

Или, если вам нужна сумма длин массивов tags:

yq eval '[.paths[].post.tags | length ] |.[] as $item ireduce(0;. + $item)' file.yml
3
20.08.2021, 10:24

Теги

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