Bash startet aufgrund dieser Zeile in .bashrc nur langsam. Was könnte das verursachen?

19

Meine .bashrcDatei enthält eine Zeile zu diesem Zweck:

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. In dieser Zeile dauert es 4 bis 5 Sekunden, bis der Cursor angezeigt wird.

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

BBales
quelle
4
Das Problem ist der findBefehl, der beim Booten ausgeführt wird und dessen Ausführung je nach Verzeichnisstruktur einige Zeit in Anspruch nehmen kann. Wenn Sie einfache statt doppelte Anführungszeichen verwenden, findwird dies zur Laufzeit ausgeführt, wenn das aliasaufgerufen wird. Es hängt davon ab, welches Arbeitsverzeichnis Sie verwenden möchten, welches zur Deklarationszeit oder zur Laufzeit aktuell ist. Übrigens $(pwd)ist ein eher ineffizienter Weg, .oder auszudrücken $PWD.
AFH
15
Ich weiß, das ist nicht das, wonach Sie fragen, aber das sieht einem XY-Problem sehr ähnlich . Warum müssen Sie das Skript mit suchen find? Sobald Sie es installiert haben, wissen Sie, wo es ist. Selbst wenn Sie es häufig aktualisieren und seinen Namen ändern, können Sie einen symbolischen Link zu ihm beibehalten, sodass er immer unter einem festen Namen verfügbar ist.
sleske
5
@AFH Bitte poste Antworten als Antworten, keine Kommentare.
David Richerby
1
@DavidRicherby - Ich wollte vor dem Posten sicherstellen, dass dies tatsächlich die Antwort war. Ich war verwirrt, dass das Skript auf Dateien in einem beliebigen Verzeichnis funktionieren würde.
AFH

Antworten:

45

Da die Befehlsersetzung in doppelten Anführungszeichen steht, wird sie zum Zeitpunkt der Definition des Befehls ausgewertet. Dies führt finddazu, dass der Inhalt Ihrer Festplatte während des .bashrcBetriebs durchsucht wird.

Sie scheinen dagegen zu wollen, 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 einer der gefundenen Dateien ein Leerzeichen enthält. Um das zu vermeiden:

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

Dieses letztere Formular funktioniert zuverlässig für jede Art von Dateinamen.

John1024
quelle
1
"Verwendungszeitpunkt". Und Ihre zweite Zeile vermeidet das Laichen einer Unterschale.
15.
11
Auf der anderen Seite müsste jetzt jedes Mal prog, findwenn Sie etwas eingeben, ausgeführt werden, während es zuvor nur einmal ausgeführt wurde (beim Starten der Shell).
el.pescado
Andererseits ist es aufgrund der Zwischenspeicherung von Dateien findnormalerweise viel schneller, wenn Sie das zweite Mal dasselbe ausführen .
Reinierpost
21
@ el.pescado Auf der anderen Seite ist es kaum vorstellbar, dass das beabsichtigte Verhalten darin besteht, den Befehl für die Dateien auszuführen, die zum Zeitpunkt der Anmeldung des Benutzers vorhanden waren, und nicht für die Dateien, die beim Ausführen des Befehls zu deren Verarbeitung vorhanden waren.
David Richerby
2
@DavidRicherby Vielleicht können wir den Pfad von zwischenspeichern progund erneut ausführen, findwenn der alte Pfad nicht mehr vorhanden ist?
Alex Vong