@Томаш: я бы не сказал "странная", но неизбежно, учитывая, что я вернулся прямо в классе после того, как я получил докторскую степень (в искусстве) и башня из слоновой кости. Я должен отметить, что есть поля---как и экспериментальной физики - - -, где частицы нетривиальная доля студентов, постдоков и профессоров *помощь* о процессе программирования и программирования. Это не означает, что мы работаем до отраслевых стандартов, но мы делаем попытки. Система контроля версий-это вездесущий (и переезд в распределенных системах); большие базы данных, отслеживания и автоматизированного построения широко распространены; контролируемых процессов выпуска могут быть найдены здесь и там. Увы пересмотра код по-прежнему довольно редки. `дю-Pshx .* * 2>/Дев/нуль` + скрытые/системные папки @Roaima и Закари благодаря вас обоих . Мне нужна помощь в этом вопросе . У меня есть несколько имя файла, которое начинается с примера . Как пример-ХК-new34.дБ ,пример-ХК-new45.дБ,пример-дифф-ХК-old63.дБ . Я только хочу, чтобы отправить файл, начиная с Пример-ХК, а также переименовать тех, файл, как пример-ХК-new34_1.дБ .

Решена в bash 5.0

Фон

На фоне (и понимание (и пытается избежать минусами этот вопрос, кажется, привлекает)) я объясню путь, который меня к этому вопросу (ну, максимум, что я могу вспомнить через два месяца).

Предположим, вы делаете несколько тестов Shell для списка символов Юникода:

е "$(е '\\У%Х ' {33..200})"

и есть более 1 миллиона символов Unicode, тестирование 20.000 из них, кажется, не так много.
Также предполагается, что набор символов как позиционные аргументы:

комплект -- $(е "$(е '\\У%Х ' {33..20000})")

с целью передачи символов для каждой функции, чтобы обрабатывать их по-разному. Поэтому функции должны быть в форме тест1 "$@" или подобные. Теперь я понимаю, насколько плохой идеей это в bash.

Теперь, предположим, что существует необходимость времени ( Н=1000 ) каждое решение, чтобы выяснить, что лучше, при таких условиях вы получите с аналогичной структурой:

#!/бин/Баш --
Timeformat компонента='реальный: %р' # '%р %У %Ы'

комплект -- $(е "$(е '\\У%Х ' {33..20000})")
Н=1000

тест1(){ Эхо "$1"; } >/dev/нуль
условие_2(){ Эхо "$#"; } >/dev/нуль
test3(){ :; }

main1(){ время для меня в $(сл $Н); сделать тест1 "$@"; сделано
 время для меня в $(сл $Н); делать условие_2 "$@"; сделано
 время для меня в $(сл $Н); делать test3 "$@"; сделано
}

main1 "$@"

Функции тест# сделаны очень просто, чтобы быть представлены здесь.
Оригиналы были постепенно сокращены, чтобы найти, где была огромная задержка.

Скрипт выше работает, вы можете запустить его и тратить несколько секунд, этого очень мало.

В процессе упрощения, чтобы найти, где именно задержка была (и уменьшения каждая функция критерия для того чтобы почти ничего не крайнюю после долгих разбирательств) я решил снять прохождение аргументы для каждого функция критерия для того чтобы выяснить, сколько времени улучшилась, только фактор 6, не много.

Чтобы попробовать себя, удалить все "$@" в функции main1 (или сделать копию) и проверить еще раз (или как main1 и копия main2main2 "$@")), чтобы сравнить. Это базовая структура внизу, в исходном посте (ОП).

Но я задался вопросом: почему принимая оболочка, которая долго "ничего не делать"?. Да, только "пару секунд", но все-таки, почему?.

Это заставило меня проверить в других оболочках, чтобы обнаружить, что только Баш этот вопрос.
Попробовать КШ ./сценарий (один и тот же сценарий, что и выше).

Это привело к данному описанию: вызов функции (тест#) без каких-либо аргументов будет отложен на аргументы в родительской (главной#). Это описание, которое следует, и был исходный пост (ОП) ниже.

Оригинальный пост.

Вызов функции (в bash 4.4.12(1)-релиз) делать нечего Ф1(){ :; } в тысячу раз медленнее, чем : но только если есть аргументы, заданные в родительской вызова функции, почему?

#!/бин/Баш
Timeformat компонента='реальный: %Р'

Ф1 () { :; }

Ф2 () {
 Эхо " параметр args = $#";
 функция printf '1 нет аргументов да; время ((я=1;я<н$; я++)); у : ; сделано 
 е '2 да функция аргументы да; время ((я=1;я<$н;я++)); сделать Ф1 ; сделано
 комплект --
 функция printf '3 да аргументов нет '; время ((я=1;я<н$; я++)); сделать Ф1 ; сделано
Эхо
}

main1() { комплект -- $(сл $м)
 Ф2 ""
 Ф2 "$@"
}

Н=1000 м; M=20000; main1

Результаты условие_1:

 параметр args = 1
1 функция без аргументов да Реал: 0.013
2 да функция аргументы да Реал: 0.024
Функция 3 да аргументов нет реальных: 0.020

 параметр args = 20000
1 функция без аргументов да Реал: 0.010
Функция 2 Да да реальные аргументы: 20.326
Функция 3 да аргументов нет реальных: 0.019

Аргументов нет, ни ввода или вывода, используемые в функции Ф1, задержка в тысячу (1000) является неожиданным.1


Продление анализов в несколько снарядов, результаты совпадают, большинство снарядов не иметь никаких проблем, ни страдать от задержки (те же n и М используются):

условие_2(){
 для Ш в тире МКШ КШ ЗШ Баш b50sh
делать
 Эхо "$Ш" >&2
# \время -ф '\т%е' сл "$м" >/dev/нуль
# \время -ф '\т%е' "$ш" -с 'комплект -- $(сл '"$м"'); ибо я делаю :; сделано'
 время \- ф '\т%е' "$ш" -с 'ф(){ :;}; А [ "$((я+=1))" -л '"$н"' ]; у : ; сделано;' $(сл $м)
 время \- ф '\т%е' "$ш" -с 'ф(){ :;}; А [ "$((я+=1))" -л '"$н"' ]; ж ; молодец;' $(сл $м)
сделано
}

условие_2

Результаты:

черточки
0:00.01
0:00.01
МКШ
0:00.01
0:00.02
КШ
0:00.01
0:00.02
ЗШ
0:00.02
0:00.04
Баш
0:10.71
0:30.03
b55sh # - без-Баш-Танос
0:00.04
0:17.11
b56sh RELSTATUS # =релиз
0:00.03
0:15.47
b50sh # отладка включена (RELSTATUS=Альфа)
0:04.62
 ХХХХХХХ более суток ......

Раскомментируйте две другие тесты, чтобы подтвердить, что ни сл или обработка списке аргументов является источником задержки.

1 это известно, что передавая результаты по доводам увеличит время выполнения. Спасибо @ОДС