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ń?


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.