Bash повільно починається через цю лінію в .bashrc. Що може спричинити це?


19

Мій .bashrcфайл містить рядок до цього ефекту:

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

Коли я коментую цей рядок, Bash починається майже миттєво, коли я відкриваю новий термінал. У цьому рядку відбувається затримка на 4-5 секунд, перш ніж з'явиться мій курсор.

Видалення вкладених команд $(pwd)тощо також прискорює її. Чому це відбувається? Чи можу я ще якось використовувати вкладені команди?


4
Проблема полягає в findкоманді, яка виконується під час завантаження і може зайняти тривалий час для виконання, залежно від структури каталогу. Якщо ви використовуєте одинарні замість подвійних лапок, findвони будуть виконуватися під час виконання, коли aliasвикликається. Це залежить від того, який робочий каталог ви хочете використовувати, поточний під час декларування або під час виконання. До речі $(pwd)досить неефективний спосіб висловити .або $PWD.
AFH

15
Я знаю, що це не те, про що ви питаєте, але це схоже на проблему XY . Чому потрібно знайти сценарій за допомогою find? Після встановлення ви знаєте, де він знаходиться. Навіть якщо ви часто оновлюєте його та змінюєте його ім'я, ви можете підтримувати символічне посилання на нього, щоб воно завжди було доступне під фіксованим іменем.
sleske

5
@AFH Будь ласка, публікуйте відповіді як відповіді, а не коментарі.
Девід Річербі

1
@DavidRicherby - я хотів переконатися, що це справді відповідь перед публікацією. Мене спантеличив, що сценарій буде працювати над файлами, знайденими в довільній директорії.
AFH

Відповіді:


45

Оскільки заміна команди знаходиться всередині подвійних лапок, вона оцінюється в той момент, коли команда визначена. Це призводить findдо перегляду вмісту вашого жорсткого диска під час .bashrcроботи.

Ви, навпаки, хочете, щоб його оцінювали під час використання. У цьому випадку використовуйте одинарні лапки:

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

Зауважте, що цей псевдонім не вдасться, якщо будь-який із знайдених файлів має пробіли у своїх іменах. Щоб цього уникнути:

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

Ця остання форма надійно працюватиме для будь-якого імені файлу.


1
'час використання'. І ваш другий рядок дозволяє уникнути нересту непрозорого.
rleir

11
З нижнього боку, тепер кожного разу, коли ви будете набирати текст prog, findпотрібно було би запустити, тоді як раніше він запускався лише один раз (при запуску оболонки).
el.pescado

Потім знову, завдяки кешуванню файлів, вдруге ви запускаєте те саме, findщо зазвичай набагато швидше.
reinierpost

21
@ el.pescado Зверху важко уявити, що передбачувана поведінка полягає у виконанні команди над файлами, які існували на момент входу користувача, а не над файлами, які існували під час виконання команди для їх обробки.
Девід Річербі

2
@DavidRicherby Можливо, ми можемо кешувати шлях progта повторно запустити, findякщо старого шляху вже не існує?
Алекс Вонг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.