Uruchomienie Bash jest powolne z powodu tej linii w .bashrc. Co może to powodować?

19

Mój .bashrcplik zawiera linię do tego efektu:

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

Kiedy komentuję ten wiersz, Bash zaczyna się niemal natychmiast po otwarciu nowego terminalu. W tym wierszu pojawia się opóźnienie 4–5 sekund, zanim pojawi się mój kursor.

Usunięcie zagnieżdżonych poleceń $(pwd)itp. Również przyspiesza je ponownie. Dlaczego to się dzieje? Czy nadal mogę jakoś używać zagnieżdżonych poleceń?

BBales
źródło
4
Problemem jest findpolecenie, które jest wykonywane w czasie rozruchu i może trwać długo, w zależności od struktury katalogów. Jeśli użyjesz pojedynczego zamiast podwójnego cudzysłowu, findzostanie ono wykonane w czasie wykonywania, gdy aliaszostanie wywołane. Zależy to od tego, którego katalogu roboczego chcesz użyć, tego, który jest bieżący w czasie deklaracji lub w czasie wykonywania. Nawiasem mówiąc, $(pwd)jest to raczej nieefektywny sposób wyrażania .lub $PWD.
AFH
15
Wiem, że nie o to pytasz, ale wygląda to na problem XY . Dlaczego musisz zlokalizować skrypt za pomocą find? Po zainstalowaniu wiesz, gdzie to jest. Nawet jeśli często go aktualizujesz i zmieniasz jego nazwę, możesz zachować symboliczny link do niego, aby zawsze był dostępny pod stałą nazwą.
sleske
5
@AFH Publikuj odpowiedzi jako odpowiedzi, a nie komentarze.
David Richerby
1
@DavidRicherby - Chciałem się upewnić, że to rzeczywiście odpowiedź przed wysłaniem. Byłem zaskoczony, że skrypt będzie działał na plikach znajdujących się w dowolnym katalogu.
AFH

Odpowiedzi:

45

Ponieważ podstawienie polecenia znajduje się w cudzysłowach, jest ono oceniane w momencie zdefiniowania polecenia. Powoduje findto przeglądanie zawartości dysku twardego podczas .bashrcpracy.

W przeciwieństwie do tego wydaje się, że chcesz to ocenić w momencie użytkowania. W takim przypadku użyj pojedynczych cudzysłowów:

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

Pamiętaj, że ten alias nie powiedzie się, jeśli którykolwiek ze znalezionych plików ma spacje w nazwach. Aby tego uniknąć:

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

Ten ostatni formularz będzie działał niezawodnie dla każdego rodzaju nazwy pliku.

John1024
źródło
1
„czas użytkowania”. A druga linia unika tworzenia podpowłoki.
rleir
11
Minusem jest to, że teraz za każdym razem, gdy piszesz prog, findtrzeba go uruchamiać, podczas gdy wcześniej był uruchamiany tylko raz (przy uruchamianiu powłoki).
el.pescado
Z drugiej strony, dzięki buforowaniu plików, drugie uruchomienie tego samego pliku findjest zwykle znacznie szybsze.
reinierpost
21
@ el.pescado Z drugiej strony trudno sobie wyobrazić, że zamierzonym zachowaniem jest uruchomienie polecenia na plikach, które istniały w momencie zalogowania użytkownika, a nie na plikach, które istnieją, gdy wykonały polecenie, aby je przetworzyć.
David Richerby
2
@DavidRicherby Może możemy buforować ścieżkę progi uruchomić ponownie, findjeśli stara ścieżka już nie istnieje?
Alex Vong,