Bash ist wegen dieser Zeile in .bashrc langsam zu starten. Was könnte das bewirken?

4465
BBales

Meine .bashrcDatei enthält eine Zeile mit diesem Effekt:

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

Wenn ich diese Zeile auskommentiere, startet Bash fast sofort, wenn ich ein neues Terminal öffne. Bei dieser Zeile gibt es eine Verzögerung von 4-5 Sekunden, bevor mein Cursor angezeigt wird.

Das Entfernen der verschachtelten Befehle $(pwd)usw. beschleunigt es auch wieder. Warum passiert dies? Kann ich trotzdem verschachtelte Befehle verwenden?

18
Das Problem ist der `find`-Befehl, der beim Booten ausgeführt wird und je nach Verzeichnisstruktur sehr lange dauern kann. Wenn Sie einfache Anführungszeichen anstelle von Anführungszeichen verwenden, wird `find` zur Laufzeit ausgeführt, wenn der` Alias` aufgerufen wird. Es hängt davon ab, welches Arbeitsverzeichnis Sie verwenden möchten, welches zur Deklarationszeit oder zur Laufzeit aktuell ist. Übrigens ist $ (pwd) ein ziemlich ineffizienter Weg, `. 'Oder` $ PWD' auszudrücken. AFH vor 7 Jahren 4
Ich weiß, dass Sie das nicht fragen, aber das sieht sehr nach einem [XY-Problem] aus (https://meta.stackexchange.com/questions/66377/what-is-the-xy- problem). Warum müssen Sie das Skript mithilfe von "find" suchen? Sobald Sie es installiert haben, wissen Sie, wo es ist. Selbst wenn Sie es regelmäßig aktualisieren und seinen Namen ändern, können Sie einen symbolischen Link dazu pflegen, so dass es immer unter einem festen Namen verfügbar ist. sleske vor 7 Jahren 15
@AFH Bitte posten Sie Antworten als Antworten, nicht als Kommentar. David Richerby vor 7 Jahren 5
@DavidRicherby - Ich wollte sicherstellen, dass dies vor dem Posting tatsächlich die Antwort war. Ich war verblüfft, dass das Skript für Dateien in einem beliebigen Verzeichnis funktionieren würde. AFH vor 7 Jahren 1

1 Antwort auf die Frage

44
John1024

Da sich die Befehlsersetzung in Anführungszeichen befindet, wird sie zum Zeitpunkt der Definition des Befehls ausgewertet. Dies führt finddazu, dass Sie den Inhalt Ihrer Festplatte während der .bashrcAusführung durchsehen.

Im Gegensatz dazu scheint es, dass es zum Zeitpunkt der Verwendung ausgewertet wird. Verwenden Sie in diesem Fall einfache Anführungszeichen:

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

Beachten Sie, dass dieser Alias ​​fehlschlägt, wenn eine der gefundenen Dateien Leerzeichen in ihren Namen enthält. Um das zu vermeiden:

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

Dieses letztere Formular funktioniert zuverlässig für alle Arten von Dateinamen.

'Nutzungszeit'. Und Ihre zweite Zeile vermeidet das Laichen einer Subshell. rleir vor 7 Jahren 1
Nachteil ist, dass jetzt jedes Mal, wenn Sie "prog" eingeben, "find" ausgeführt werden muss, während es vorher nur einmal ausgeführt wurde (beim Start der Shell). el.pescado vor 7 Jahren 11
Aufgrund des Datei-Cachings ist das zweite Mal, wenn Sie das gleiche "find" ausführen, normalerweise viel schneller. reinierpost vor 7 Jahren 0
@ el.pescado Auf der anderen Seite ist es schwer vorstellbar, dass das beabsichtigte Verhalten darin besteht, den Befehl mit den Dateien auszuführen, die zum Zeitpunkt der Benutzeranmeldung vorhanden waren, und nicht mit den Dateien, die bei der Ausführung des Befehls zur Verarbeitung vorhanden waren. David Richerby vor 7 Jahren 21
@DavidRicherby Vielleicht können wir den Pfad von `prog` zwischenspeichern und` find` erneut ausführen, wenn der alte Pfad nicht mehr existiert? Alex Vong vor 7 Jahren 2