Bash запускается медленно из-за этой строки в .bashrc. Что может вызвать это?

4372
BBales

Мой .bashrcфайл содержит строку с этим эффектом:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)" 

Когда я закомментирую эту строку, Bash запускается практически мгновенно, когда я открываю новый терминал. В этой строке задержка составляет 4-5 секунд, прежде чем появляется мой курсор.

Удаление вложенных команд $(pwd)и т. Д. Также ускоряет его. Почему это происходит? Могу ли я как-то использовать вложенные команды?

18
Проблема заключается в команде `find`, которая выполняется во время загрузки и может занять много времени, в зависимости от структуры каталога. Если вы используете одинарные вместо двойных кавычек, `find` будет выполняться во время выполнения, когда вызывается` alias`. Это зависит от того, какой рабочий каталог вы хотите использовать, этот текущий во время объявления или во время выполнения. Кстати, `$ (pwd)` - довольно неэффективный способ выражения `.` или` $ PWD`. AFH 7 лет назад 4
Я знаю, что это не то, о чем вы спрашиваете, но это очень похоже на [проблему XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Зачем вам нужно найти скрипт, используя `find`? Как только вы установили его, вы знаете, где он находится. Даже если вы часто обновляете его и меняете его имя, вы можете сохранить символическую ссылку на него, чтобы он всегда был доступен под фиксированным именем. sleske 7 лет назад 15
@AFH Пожалуйста, отправляйте ответы как ответы, а не комментарии. David Richerby 7 лет назад 5
@DavidRicherby - я хотел убедиться, что это был действительно ответ перед публикацией. Я был озадачен тем, что скрипт будет работать с файлами, найденными в произвольном каталоге. AFH 7 лет назад 1

1 ответ на вопрос

44
John1024

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

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

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)' 

Обратите внимание, что этот псевдоним завершится ошибкой, если в любом из найденных файлов есть пробелы в именах. Чтобы избежать этого:

alias prog='find . -name prog -exec /path/to/script.sh {} +' 

Эта последняя форма будет надежно работать с любым именем файла.

«время использования». И ваша вторая строка избегает порождения недракушки. rleir 7 лет назад 1
С другой стороны, теперь каждый раз, когда вы набираете `prog`, нужно запускать` find`, тогда как раньше он запускался только один раз (при запуске оболочки). el.pescado 7 лет назад 11
Опять же, из-за кэширования файлов, во второй раз, когда вы запускаете ту же самую `find`, она обычно намного быстрее. reinierpost 7 лет назад 0
@ el.pescado С другой стороны, трудно представить, что предполагаемое поведение - запускать команду для файлов, которые существовали на момент входа пользователя в систему, а не для файлов, которые существуют, когда они выполняли команду для их обработки. David Richerby 7 лет назад 21
@DavidRicherby Может быть, мы можем кешировать путь `prog` и повторно запустить` find`, если старый путь больше не существует? Alex Vong 7 лет назад 2

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