7.15. Преодоление ограничений на длину командной строки

Описание:  Длина командной строки ограничена. Порой приходится создавать командные строки, которые не помещаются в отведённых пределах. Кандидат должен знать как запустить команду несколько раз с различными аргументами, используя xargs(1) или цикл while.

Практика: xargs(1), find(1).

Комментарий

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

Для того, чтобы обойти эту проблему существует команда xargs(1), разработанная как команда парная команде find(1). Эта программа получает список аргументов со стандартного ввода (как правило через pipe) и несколько раз вызывает программу указанную в её аргументе передавая ей всё новые и новые порции аргументов. Совместная работа find(1) и xargs(1) подробно описана в Раздел 7.6.3, «Связка с командой xargs». Здесь же посмотрим, как программа xargs(1) позволяет обойти ограничение на длину командной строки.

Для этого напишем следующий скрипт:

#!/bin/sh
echo $# >> invoke
        

Назовём его test.sh и вызовем следующим образом:

$ find / 2>/dev/null -print0 | xargs -0 ./test.sh
        

По завершении его работы мы найдём, что в файле invoke скопилось несколько сот записей свидетельствующих о запуске test.sh, при этом количество аргументов, с которыми был вызван скрипт, будет колебаться от пятисот, до двух с половинй тысяч.

Если же мы попробуем запустить test.sh один раз, передав ему сразу все аргументы, нас конечно ждёт фиаско:

$ ./test.sh `find / 2>/dev/null`
./test.sh: Argument list too long