К настоящему времени вы, вероятно, уже достаточно хорошо понимаете, как выполнять команду в bash. Но что, если вы хотите выполнять потоки команд последовательно, а иногда и параллельно? Именно здесь мы и обнаруживаем, что используем xargs.
Здесь мы надеемся ответить на все эти вопросы и многое другое о bash и команде xargs на примере.
- Что такое xargs в bash?
- Параметры Xargs с примерами bash
- Xargs info
- Xargs help
- Версия Xargs
- Ограничения Xargs
- Подробный Xargs
- Поведение Xargs
- Xargs null
- Xargs interactive
- Файл Xargs
- Xargs replace
- Xargs parallel
- Разделитель Xargs
- Примеры xargs в Bash
- Примеры команды Bash xargs
- Пример) Сделайте свой собственный ввод: весело с xargs без ввода
- Пример) Использование xargs в качестве заполнителя для интерактивных каналов
- Пример) Используйте xargs как заполнитель для интерактивных аргументов
- Пример) Генератор статических сайтов
- Bash Примеры сценария xargs
- Пример) Использование xargs для создания квадратных матриц
- Примеры практического использования Bash xargs g>
- Пример) Поиск в файлах шаблона с помощью xargs grep
- Пример) Установите программное обеспечение из списка с помощью apt-get в Ubuntu
- Пример) Curl seige с использованием xargs в bash
- Отладка Bash xargs
- Пример) Отладка xargs с использованием размера стандартного вывода ошибок
- Функции Bash xargs
- Заключение
Что такое xargs в bash?
xargs — это внешняя команда, используемая для преобразования стандартного ввода в аргументы командной строки , которая, как говорят, обозначает «расширенные аргументы». Он был в основном создан для использования с командами, не предназначенными для обработки конвейерного или стандартного ввода, таких как rm, cp, echo 1 и другими внешними командами, принимающими только аргументы в качестве параметров.
1 Хотя в большинстве систем есть команда echo, echo является встроенной функцией bash; То есть, если не вызывается команда echo, используется встроенное echo. Точно так же встроенные команды bash не знают о конвейерном вводе.
Параметры Xargs с примерами bash
Давайте рассмотрим xargs и его параметры с примерами в bash. Наряду с традиционной обработкой параметров командной строки, ожидаемой с помощью xargs, параметры сгруппированы по объектам, таким как получение информации или изменение поведения.
Xargs info
Вот параметры, предоставляющие информацию о xargs.
Xargs help
Использование: xargs [OPTION] … COMMAND [INITIAL-ARGS] …
Выполнить COMMAND с аргументами INITIAL-ARGS и другими аргументами, считываемыми из ввода.
Обязательные и необязательные аргументы для длинные параметры также являются
обязательными или необязательными для соответствующего короткого параметра.
-0, —null элементы разделяются нулем, а не пробелами;
отключает обработку кавычек и обратной косой черты и
логическую обработку EOF
-a, — arg-file = FILE читать аргументы из ФАЙЛА, а не из стандартного ввода
-d, —delimiter = CHARACTER элементы во входном потоке разделяются CHARACTER,
не пробелами; отключает обработку кавычек и обратной косой черты
и логическую обработку EOF
-E END устанавливает логическую строку EOF; если END встречается как строка
ввода, остальная часть ввода игнорируется
(игнорируется, если было указано -0 или -d)
-e, —eof [= END] эквивалентно -E END, если указано END;
в противном случае нет строки конца файла
-IR то же, что и —replace = R
-i, —replace [= R] заменить R в INITIAL-ARGS именами, прочитанными
из стандартного ввода; если R не указан,
предположим, что {}
-L, —max-lines = MAX-LINES использовать не более MAX-LINES непустых строк ввода на
командную строку
-l [MAX-LINES] аналогично -L, но по умолчанию используется не более одной не —
пустой строки ввода, если MAX-LINES не указан
-n, —max- args = MAX-ARGS использовать не более MAX-ARGS аргументов в командной строке
-P, —max-procs = MAX-PROCS запускать не более MAX-PROCS процессов одновременно
-p, — интерактивное приглашение перед запуском команд
— process-slot-var = VAR установить переменную среды VAR в дочерних процессах
-r, —no-run-if-empty, если аргументов нет , то не запускайте КОМАНДУ;
, если эта опция не указана, КОМАНДА будет
запущена хотя бы один раз
-s, —max-chars = MAX-CHARS limit length из командной строки в MAX-CHARS
— show-limits показать ограничения на длину командной строки
-t, —verbose команды печати перед их выполнением
-x, — выход выйти, если размер (см. -s) превышено
— помочь отобразить эту справку и выйти
— версия вывести информацию о версии и выйти
Обратитесь к справке xargs как к быстрой справке по Использование и параметры xargs.
Версия Xargs
xargs (GNU findutils) 4.6.0
Ограничения Xargs
Даже у xargs есть ограничения. Параметр –show-limits для xargs показывает ограничения, используемые xargs перед запуском команд. Фактические ограничения зависят от вашей среды. Однако для большинства пользователей этого достаточно. Пределы можно настроить в командной строке, см. Примеры.
Пример) Ограничения xargs вашей среды
Ваш переменные среды занимают 6234 байта
Верхний предел длины аргумента POSIX (эта система): 23718
Наименьший допустимый верхний предел длины аргумента POSIX (все системы): 4096
Максимальная длина команда, которую мы могли бы использовать: 17484
Размер фактически используемого буфера команд: 23718
Максимальный параллелизм (—max-procs не должен быть больше): 2147483647
Выполнение xargs будет продолжено, и он попытается прочитать свой ввод и выполнить команды; если это не то, что вы хотели, введите нажатие клавиши в конце файла.
Предупреждение: эхо будет запущено хотя бы один раз. Если вы не хотите, чтобы это произошло, нажмите клавишу прерывания.
Обратите внимание, что команда, которая будет запускаться как следствие xargs, — это echo, команда xargs по умолчанию.
Пример) Ограничения Xargs с настроенным ограничением буфера команд
Переменные среды занимают 9479 байт
Верхний предел длины аргумента POSIX (эта система): 20473
Наименьший допустимый верхний предел длины аргумента POSIX (все системы): 4096
Максимум длина команды, которую мы могли бы использовать: 10994
Размер фактически используемого буфера команд: 1
Максимальный параллелизм (—max-procs не должен быть больше): 2147483647
…
Предупреждение: эхо будет запущено хотя бы один раз. Если вы не хотите, чтобы это произошло,
затем нажмите клавишу прерывания.
xargs: не может поместиться один аргумент в пределах ограничения размера списка аргументов
Примечание эти ошибки появятся внизу после предупреждений, если таковые имеются. У нас есть ошибка «xargs: не может поместиться один аргумент в пределах ограничения размера списка аргументов», что просто означает, что мы пытаемся работать за пределами разрешенного размера командного буфера, который установлен на символ.
Буфер команд содержит команду, за которой следуют все аргументы, включая пробелы.
В случае команды в этом примере параметра xargs, буфер команд имеет вид
, который содержит 4 символа.
Итак, нам нужно установить размер командного буфера на значение больше или равное 5 следующим образом. Обратите внимание, что потребление буфера команд будет равно length_of_command + length_args_including_spaces_plus_one + 1.
# Больше никаких «xargs: не может поместиться один аргумент в пределах ограничения размера списка аргументов»
error
Но что, если наша команда имеет аргументы?
echo y
…
Подробный Xargs
Параметр -t может использоваться для отображения команд, запускаемых xargs, в качестве вывода на fd2, стандартная ошибка. То есть xargs -t можно обнулить, перенаправив стандартную ошибку на/dev/null следующим образом.
Пример) Да один раз
true yyyyy
Пример) Да 5 раз
true y
true y
true y
true y
true y
Поведение Xargs
Ни одна команда не завершится без параметров для изменения поведения во время выполнения. Xargs ничем не отличается. Вот параметры, позволяющие изменить его поведение.
Xargs null
Параметр –0 может использоваться, чтобы указать xargs использовать null вместо пробелов. Он также отключает кавычки и escape-последовательности.
тупик
тупик
тупик- мешок
тупик
тупик
да | head -n 5 | sed «s/.*/cul-» de «- ‘sac’/» | xargs -0 -I {} echo -en » n x00 {}»
cul- «de» — ‘sac’
cul- «de» — ‘sac ‘
тупик — «де» -‘ мешок ‘
тупик- «де» -‘ мешок ‘
тупик- «де» -‘ мешок ‘
Случай использования Xargs null
Предполагается, что значение null xargs используется для обработки таких случаев, когда элементы содержат пробелы, такие как файлы, содержащие пробелы или символы новой строки.
Предположим, у вас есть каталог «abc», включая пробелы в имени каталога.
de/fg/h/’ijk l’/
Вы хотите запустить команду для каждого каталога в «abc», используя команду find.
Вы можете попробовать следующее:
du: нет доступа к ‘a’: нет такого файла или каталога
du: нет доступа ‘b’: нет такого файла или каталога
du: нет доступа к ‘c’: нет такого файла или каталога
du: нет доступа ‘a’: нет такого файла или каталога
du: нет доступа к ‘b’: нет такого файла или каталог
du: нет доступа к ‘c/de’: нет такого файла или каталога
du: нет доступа ‘a’: нет такого файла или каталога
du: нет доступа ‘ b ‘: нет такого файла или каталога
du: нет доступа’ c/fg ‘: нет такого файла или каталога
du: нет доступа’ a ‘: нет такого файла или каталога
du: нет доступа к ‘b’: нет такого файла или каталога
du: нет доступа ‘c/h’: нет такого файла или каталога
du: нет доступа к ‘a’: нет такого файла или каталог
du: нет доступа к ‘b’: нет такого файла или каталога
du: нет доступа ‘c/i’: нет такого файла или каталога
du: нет доступа ‘ j ‘: нет такого файла или каталога
du: нет доступа’ k ‘: нет такого файла или каталога
du: нет доступа’ l ‘: нет такого файла или директива tory
Это работает неправильно, потому что имена наших каталогов пронизаны пробелами. Это не было вашим намерением.
Вы можете исправить это, добавив замену xargs, то есть -I {} следующим образом.
0 abc
0 abc/de
0 abc/fg
0 abc/h
0 abc/ijkl
Он работает правильно при использовании замены xargs. Обратите внимание, что мы использовали -i, что является сокращением для -I {}.
Другой способ добиться того же результата — использовать xargs null, –null в сочетании с параметром find -print0 как следует.
0 abc
0 abc/de
0 abc/fg
0 abc/h
0 abc/ijkl
Отлично! Теперь у нас есть несколько способов проделать свой путь вглубь вселенной файловых систем, не беспокоясь о столкновении с космическим мусором в нашем путешествии. Отлично.
Xargs interactive
Может быть, вы не доверяете xargs запускать все команды без подтверждения. В этом случае xargs interactive или -p — это опция, которая вам нужна для управления тем, какие команды запускаются xargs, как показано ниже.
du -d 0 -habc? …
du -d 0 -habc/de? …
du -d 0 -habc/fg? … y
0 abc/fg
du -d 0 -habc/h? … Да
0 abc/h
du -d 0 -habc/ijkl? … no
Здесь любая команда, начинающаяся с ‘y’ или ‘Y’ запущен. В противном случае команды игнорируются.
Файл Xargs
У вас уже есть файл arg-file, готовый для чтения в xargs. Ваша программа может ждать где-то в каком-то каталоге, чтобы кто-то другой или другой ваш экземпляр поместили в arg-файл. В этом случае вы можете указать файл в качестве опции для xargs с помощью -a arg-file вместо использования cat file | xargs… Примеры файлов Xargs приведены ниже.
Ради удовольствия, давайте превратим ваши процедуры очистки рабочего стола в arg-файл, который мы сможем использовать.
190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt
pdiv> файл # pdiv> процедура, которую можно запустить с помощью bash. Это означает, что мы будем использовать команду bash.
Давайте запустим процедуры очистки с помощью xargs.
190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt
И это работает # br> br> На тот случай, если нам нужно указать arg-файл вместо использования конвейерного ввода, нам пригодится опция файла xargs.
Xargs replace
И последнее, но не менее важное: xargs replace -i позволяет вам получить полный контроль над форматом команды перед ее запуском. Можно использовать любой символ. Однако, следуя соглашению, большинство программистов на bash используют этот {} или этот%. Обратите внимание, что по умолчанию используется {}. -i сообщает xargs, что вы будете использовать значение по умолчанию. И это считается стенографией. -I, за которым следует замещающий символ по вашему выбору, сообщает xargs, какой символ вы будете использовать. Избегайте использования общих символов, таких как буква а. Это нарушит ваш код больше, чем любой пробел или перевод строки.
Xargs parallel
Xargs parallel -P позволяет выполнять команды одновременно, а не последовательно. См. Допустимые аргументы для n_ge_1 или параллелизма в xargs limits –show-limits. Например, если
Вы можете установить — P 2147483647 без ошибок. На практике вы можете найти более приятный параметр, например -P 99, который улучшает общую производительность без увеличения накладных расходов на управление параллельными процессами.
Ниже приведены примеры, показывающие, как использование параллельного xargs может улучшить производительность.
Пример) Последовательный подсчет по сравнению с параллельным с использованием xargs
Давайте посмотрим, что произойдет, когда мы будем считать время последовательно с помощью xargs.
…
998
999
1000
real 1m13.927s
user 0m6.994s
sys 0m15.184s
Теперь посмотрим, что произойдет, если мы будем считать время параллельно с использованием xargs.
…
998
999
1000
реальный 0m13.554s
пользователь 0m6.446s
sys 0m14.293s
Существенное улучшение производительности наблюдается при использовании параллельных xargs для выполнения простых команд без общих ресурсов.
Пример) Сравнение порядка и времени параллельных xargs
Давайте посмотрим, что происходит, когда команда потребляет время процессора.
1
2
3
4
5
6
7
8
9
10
реальный 0m5.601s
пользователь 0m0.180s
sys 0m0.334s
Обратите внимание, что все команды выполняются по порядку.
Теперь посмотрим, что происходит, когда одна и та же команда выполняется параллельно.
3
4
6
7
8
1
2
5
9
10
реальный 0m1,257s
пользователь 0m0.060s
sys 0m0.225s
Команды 1, 2, 5 и 9 перешли в режим сна. Однако нам удалось сократить время выполнения
на 78 процентов.
Параллельное заключение Xargs
Простое добавление xargs parallel в качестве параметра командной строки может повысить производительность в десять раз. Однако следует проявлять осторожность при использовании процедур, зависящих от порядка, или когда команды совместно используют ресурсы.
Разделитель Xargs
Xargs delimiter -d позволяет вам установить разделитель элементов на любой символ c так же, как символы-разделители устанавливаются в команде cut.
При использовании xargs null -0 для -dc устанавливается нулевой символ -d x00.
Например, вы можете установить в качестве разделителя пробел, то есть -dc — это ‘-d’ в командной строке или в вашем сценарии bash.
Вы можете установить разделитель на символ запятой, т.е. -dc — это ‘-d,’.
Параметр разделителя в xargs -d позволяет вам установить разделитель элементов на любой символ вы хотите.
Примеры xargs в Bash
Здесь мы рассмотрим примеры использования команды xargs в bash, включая пример использования в команде строка, а также скрипты.
Примеры команды Bash xargs
Здесь мы рассмотрим пример использования команды xargs в командной строке в bash включая пример использования с p и без него iped input.
Пример) Сделайте свой собственный ввод: весело с xargs без ввода
Что xargs делает дома один?
Привет, кто-нибудь дома?
…
(Ctrl-D)
Привет, кто-нибудь дома? …
Похоже, мы вернули наш вопрос в качестве ответа, но, похоже, это просто эхо.
Почему?
Как вы, возможно, читали, в чем суть xargs, он преобразует стандартный ввод в аргументы командной строки. Если не указаны параметры и аргументы, он ведет себя как команда echo с поддержкой канала. То есть:
Привет, есть ли кто-нибудь дома?
…
(Control-D) 2
Неявно генерирует эквивалентное выражение командной строки echo
2 В сценарии heredoc можно использовать следующим образом.
xargs Здравствуйте, есть ли кто-нибудь дома?
…
EOF
echo Привет, есть ли кто-нибудь дома? …
Пример) Использование xargs в качестве заполнителя для интерактивных каналов
Использование xargs в левой части канала парадоксально 4 , поэтому давайте запустим bash в сверхограниченном режиме 5 .
4 Команды с поддержкой конвейера не нужны xargs. Неизвестные команды конвейера не знают о xargs
5 Ограниченный режим, который сбрасывает каждую строку. Другие ограничения могут быть добавлены позже.
i = 1
echo $ {i }
echo Привет!
Привет!
!!
bash: !!: команда не найдена
i = 1; echo $ {i}
1
cd ..
bash: line 0: cd: limited
Пример) Используйте xargs как заполнитель для интерактивных аргументов
Согласно отчету о навыках разработчиков HackerRank за 2019 год 3 , «Калькуляторы — это новые игры». Все больше разработчиков моложе 38 лет продвигают калькуляторы как свой первый проект по программированию. 3 Выводы, основанные на 71 281 разработчике
Итак, давайте создадим калькулятор с использованием xargs!
while:
do
_ $ (xargs)
done
1 + 2 + 3 + 4
( Ctrl-D)
10
1-2 + 3-4 + 5
(Ctrl-D)
3
1 ** 2 + 2 ** 2
(Ctrl-D)
3
1 +
2 +
3 +
4 +
5
(Ctrl-D)
15
Пример) Генератор статических сайтов
Предположим, вы у вас есть несколько тысяч простых текстовых файлов, которые вы хотите использовать для создания статического сайта, и ни один из файлов не имеет имени index. Имена файлов включают символы ascii в нижнем регистре и дефис, если они есть.
Вот как будут выглядеть одна или две строки в терминале теоретической машины, на которой запущен bash. На машине будут и другие внешние команды, включая findutils и pandoc. Вы можете использовать любую эквивалентную команду по вашему выбору.
# видим много файлов
{
test -d «html» || mkdir -v $ {_}
найти. -mindepth 1 –maxdepth 1 -тип f
| xargs -P 6000 -i bash -c «echo {}; cat {} | sed -e ‘s/$//’ |
pandoc -thtml -o {} .html»
}
# теперь видим вдвое больше файлов, включая файлы HTML
# done
Bash Примеры сценария xargs
Пример) Использование xargs для создания квадратных матриц
Вот сценарий, который я приготовил для создания квадратных матриц с использованием xargs. В частности, он использует поведение, использующее параметр -n, и использует команду seq для последовательностей чисел, которые будут использоваться в матрицах..
## square-matrix
## — генерирует квадратные матрицы
## версия 0.0 .1 — начальный
##################################################################################################### #########
square-matrix-help () {
{
cat квадратная матрица
1 — порядок
ПРИМЕРЫ
> квадратная матрица 1
1
> квадратная матрица 2
1 2
3 4
> квадратная матрица 3
1 2 3
4 5 6
7 8 9
EOF
}
}
квадратная матрица () {{локальный -i порядок; заказ = $ {1}; }
тест «$ {order}» || {$ {FUNCNAME} -help; возвращаться ; }
test $ {order} -gt 0 || {$ {FUNCNAME} -help; возвращаться ; }
_ () {
seq $ (($ {1} ** 2)) | xargs -n $ {1}
}
_ $ {порядок}
}
############### ################################
if [! ]
затем
true
else
exit 1 # неправильные аргументы
fi
########## #####################################
квадратная матрица $ { @}
######################################## #######
## сгенерировано create-stub2.sh v0.1.2
## в среду, 29 мая 2019 г. 13:44:06 +0900
# # см.
############################# ###################
Источник: square-matrix.sh
I также включена тестовая программа для демонстрации сценария в действии, генерирующего все квадратные матрицы размером до 10 x 10.
## test-square-matrix
## — генерирует квадратные матрицы размером до 10 x 10
## версия 0.0.1 — исходная
########### #####################################
тест-квадрат-матрица ( ) {
test -f «square-matrix.sh»
. $ {_} 1>/dev/null
local i
для i в {1..10}
do
echo «квадратная матрица ($ { i}) «
квадратная матрица $ {i}
done
}
################# ###############################
if [$ {#} -eq 0]
затем
true
else
exit 1 # неправильные аргументы
fi
############# ##################################
тест-квадрат-матрица
######################################################################## ##
## сгенерировано create-stub2.sh v0.1.2
## в среду, 29 мая 2019 г. 13:40:08 +0900
## см.
############################################################## ###############
Источник: test-square-matrix.sh
Вот что нужно ожидайте:
квадратная матрица (1)
1
квадратная матрица (2)
1 2
3 4
квадрат- матрица (3)
1 2 3
4 5 6
7 8 9
…
Упражнение: улучшите отображение в терминале, применив отступы к числам
Когда мы пытаемся сгенерировать квадратную матрицу порядка 10 на 10, мы получаем следующий результат:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
В качестве упражнения расширите файл square-matrix.sh, чтобы обеспечить вывод, как показано ниже.
001002003004005006007008009010
011 012 013 014 015 016 017 018 019 020
021022023 024 025 026 027 028 029 030
031032 033 034 035 036 037 038 039 040
041042043044045046047048 049 050
05105205305405556057058059060
061062 063 064 065 066 067 068 069 070
071072073074076077078079080
081082083084085087088089090
091092093 094 095 096 097 098 099 100
Примеры практического использования Bash xargs g>
Пример) Поиск в файлах шаблона с помощью xargs grep
1 list-files — это команда, возвращающая возможные пути к файлу, которые будут приняты в качестве входных данных для grep с помощью команды xargs
В качестве практического примера использования xargs в bash я откопал xargs из базы секретного кода.
994
Существует 994 сценария bash. Посмотрим, сколько у команды xargs.
xargs в кодовой базе.
…
find -type f -name *. sh | xargs grep -e xargs | wc -l
18
В базе кода 18 совпадений для xargs. Теперь мы могли бы захотеть выяснить, сколько скриптов используют xargs.
uniq перечисляет сценарии с использованием xargs.
…
find -type f -name *. sh | xargs grep -e xargs | вырезать ‘-d:’ ‘-f1’ |
сортировать | uniq | wc -l
10
Отлично! В базе кода 10 скриптов с xargs. Посмотрим, что это такое.
vim $ (!!)
Сводка результатов
-
- Поиск и уничтожение файлов, содержащих шаблон в имени файла
-
- Вывести информацию о файлах на левой стороне канала
-
- Сделать файлы исполняемыми
-
- Список имен файловых каталогов
-
- Очистить все
-
- Zip-файлы
-
- Список базовых имен файлов
Пример) Установите программное обеспечение из списка с помощью apt-get в Ubuntu
При обновлении Ubuntu после резервного копирования в вашей системе вам, возможно, придется установить новое программное обеспечение. Предположим, у вас есть список программного обеспечения для установки с помощью apt-get в Ubuntu.
awk ‘{print $ 1}’ & gt; install_software
# …
cat install_software | xargs sudo apt-get install
Пример) Curl seige с использованием xargs в bash
Предположим, у вас есть группа URL-адресов, ведущих к одному узлу где-то в в Интернете, и вы хотите выполнить осаду, используя curl в bash. Желательно, чтобы это был один из ваших узлов, и осада не находится в вашей производственной среде. Вот как мы устанавливаем осаду, используя xargs в bash.
filter ()
{
grep -o -e ‘loc [^ ‘ ‘-f2’
}
get-arg-file ()
{
curl https://linuxhint.com/sitemap. xml —silent
| фильтр
| xargs -i curl —silent {}
| фильтр
| xargs -i echo {}> arg-file
}
#declare -f curl
curl ()
{
echo (поддельный) $ {FUNCNAME} «$ {@}»
}
объявить -xf curl
payload ()
{
test -f «arg-file «|| return
xargs -P 1000 -a arg-file -i echo curl {} | bash 1>/dev/null
}
seige ()
{
test -f «arg-file» || get — $ {_}
payload
}
seige
Отладка Bash xargs
Когда вы сидите перед терминалом, вы босс. Однако, когда что-то идет не так, помогает, если вы знаете, как на самом деле отлаживать сценарии bash, как босс.
Не рискуйте, имея метод проверки успеха при использовании xargs в bash, а не слепо ожидать всего все будет хорошо, настоятельно рекомендуется. То есть вы должны убедиться, что все команды, выполненные успешно или неудачно, не оставлены без флажка.
Методы
- Размер стандартного вывода ошибок
Если стандартная ошибка содержит 1 или более символов, что-то пошло не так - Сумма кодов выхода команды
Если итог выхода коды больше 0, что-то пошло не так - Проверка полезной нагрузки
Если часть полезной нагрузки отсутствует, что-то пошло не так - Конец проверки скрипта
- Выполнение команд xargs как скрипта, если конец скрипта не достигнут, что-то пошло не так. Обратите внимание, что установлен errexit, и команды запускаются изнутри функции.
- Другой метод
Если результат отличается от ожидаемого, то, возможно, что-то пошло не так.
Пример) Отладка xargs с использованием размера стандартного вывода ошибок
Вот анонимная функция, с помощью которой мы тестируем отладку xargs с использованием стандартной ошибки.
#, если вы обнаружите, что немного устали, объявите, что я написал другой учебник на
#
как команда объявления работает в bash
_ ()
{
rm -vf errout;
touch $ {_};
echo {1..10} | xargs -x -P 10 ‘-d’ -i bash -c «test $ (($ {RANDOM}% $ {1})) -eq 0 ||
{echo {} 1> & 2; exit ;}; echo {} «2> ошибка;
тест! $ (wc }
## test
_ 1 # вероятность отказа (= 1-1/1 = 0%)
_ 2 # вероятность отказа (= 1-1/2 = 1/2 = 50%)
_ 3 # вероятность отказа (= 1-1/3 = 2/3 = 60%)
…
Если вы не используете стандартную ошибку для чего-либо еще, использование размера стандартной ошибки для отладки xargs — это один из методов, который может сработать для вас.
Функции Bash xargs
Иногда вам нужно использовать функции, которые вы определили в xargs. Для этого нам нужно сделать функцию доступной для xargs. Вот как это сделать.
_ ()
{
echo $ {@ ^^}
}
echo {a..z} {1..9} | xargs ‘-d’ -i bash -c «_ {}»
bash: _: команда не найдена
…
объявить –xf _
echo {a..z} {1..9} | xargs ‘-d’ -i bash -c «_ {}»
A1
A2
A3
…
# или
echo {a..z} {1..9} | xargs ‘-d’ -i echo «_ {}» | bash
…
Z7
Z8
Z9
Обратите внимание, что приведенный выше пример интерактивного сеанса можно ускорить вверх с помощью bash xargs parallel.
Заключение
Xargs — одна из многих внешних команд, которые вам лучше знать в bash . При написании этого руководства по команде xargs я сам изучил несколько дополнительных опций. Рекомендуется время от времени пересматривать. Только тогда вы сможете использовать xargs в полной мере. А пока продолжайте писать код.