&>>
является правильным синтаксисом в оболочке 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
}
Это уменьшает количество перенаправлений до одного, группируя команды, выходные данные которых должны быть перенаправлены, в фигурных скобках и перенаправляя эту составную команду как единое целое.
Это МОЖЕТ быть тем, что вы пытаетесь сделать, используя любой awk в любой оболочке на каждой машине Unix:
$ awk '!/^ /{f=/^paths:/} f && /^ \//{cnt++} END{print cnt+0}' file
3
В основном это зависит от того, что вы подразумеваете под «ключом».
Предполагая, что под «количеством ключей под 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