Эффективный способ создать несколько файлов

Необходимо использовать команду disown. Это выпустит STDIN/STDOUT от текущей оболочки, куда Вы выполняете эти команды.

% disown -a

- или -

% sleep 100 &
[1] 7987
% disown %1

См. страницу справочника удара для получения дальнейшей информации.

отрицайте [-площадь] [-h] [jobspec...] опции Without, каждый jobspec удален из таблицы активных заданий. Если-h опция дана, каждый jobspec не удален из таблицы, но отмечен так, чтобы SIGHUP не был отправлен в задание, если оболочка получает SIGHUP. Если никакой jobspec не присутствует, и ни-a, ни-r опция не предоставляются, текущее задание используется. Если никакой jobspec не предоставляется,-a опция означает удалять или отмечать все задания;-r опция без jobspec аргумента ограничивает операцию рабочими заданиями. Возвращаемое значение 0, если jobspec не указывает допустимое задание.

7
20.03.2014, 00:34
3 ответа
[115128] Ограничение касается размера аргументов при выполнении [12269] команды [12270]. Таким образом, можно выполнить команду с меньшим количеством аргументов, например, с помощью [115815]xargs[115816], чтобы выполнить меньшие партии, увеличить лимит ([115817]ulimit -s 100000[115818] на Linux), ничего не выполнять (делать все это в оболочке), или собрать список в утилите, которая создает файлы. [12271]zsh[115820], [115821]ksh93[115822], [115823]bash[115824]:[12272]printf[115826] построен, поэтому нет [115827]exec[115828], поэтому лимит не достигнут. [115829]xargs[115830] разбивает список аргументов, переданных на [115831] touch[115832], чтобы избежать превышения предела. Это все еще не очень эффективно, так как оболочка сначала должна создать весь список (медленно, особенно с [115833]bash[115834]), хранить его в памяти, а затем распечатать.[12273] (если предположить, что у вас есть команда [115835]seq[115836]) было бы более эффективно.[12274]Все делается в оболочке, нет большого списка, хранящегося в памяти. Должно быть относительно эффективно, за исключением, возможно, команды [115837]bash[115838].[12275]POSIXly:[12276]
12
27.01.2020, 20:15
[115084] Вы ограничены максимальным количеством аргументов [115765]touch[115766], которые могут быть обработаны. Лучшим вариантом будет использование цикла. Для этого вам не нужен рубин, хотя:[12248]Альтернативным подходом может быть разбиение числа на куски, скажем, 100, а затем подача их на [115767]touch[115768] одновременно:[12249]
3
27.01.2020, 20:15
[115118] В вашем примере Бэш жалуется, потому что при расширении [115797]test_{1...1391803}.txt[115798] он заканчивается слишком длинной командной строкой с аргументами. Максимальная длина командной строки, которая может быть передана команде, фиксируется ядром, потому что системный вызов [115799]exec[115800], который отвечает за запуск новых процессов (фактически, заменив программу существующего процесса на другую), должен поместить эти аргументы в стек процесса, а размер стека ограничен. [12265] Я думаю, что наиболее эффективным способом сделать это было бы не запускать новый процесс [115801]touch[115802] каждый раз, когда вам нужен файл.[12266] Можно было бы, например, в рубине:[12267] Таким образом, вы запускаете только один процесс, который создаст все файлы без необходимости запуска программы [115803]touch[115804].[12268] Эта команда запускает интерпретатор рубина. Затем рубин строит цикл по диапазону [115805]1...1391803[115806] и для каждого номера вызывает функцию [115807]File.open[115808], которая выполняет системный вызов [115809]open[115810] с именем файла, собранного с этим номером. Так как блок после [115811]File.open[115812] пуст, файл сразу же закрывается. [115127]
3
27.01.2020, 20:15

Теги

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