Bash si avvia lentamente a causa di questa riga in .bashrc. Cosa potrebbe causare questo?


19

Il mio .bashrcfile contiene una riga in questo senso:

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

Quando commento questa riga, Bash si avvia quasi istantaneamente quando apro un nuovo terminale. Con questa linea, c'è un ritardo di 4-5 secondi prima che il mio cursore si presenti.

Anche la rimozione dei comandi nidificati $(pwd), ecc. Accelera nuovamente. Perché sta succedendo? Posso comunque usare i comandi nidificati in qualche modo?


4
Il problema è il findcomando, che viene eseguito all'avvio e può richiedere molto tempo, a seconda della struttura della directory. Se usi virgolette singole anziché doppie, findverrà eseguito in fase di esecuzione, quando aliasviene invocato. Dipende dalla directory di lavoro che si desidera utilizzare, quella corrente al momento della dichiarazione o in fase di esecuzione. A proposito $(pwd)è un modo piuttosto inefficiente per esprimere .o $PWD.
AFH,

15
So che non è quello che stai chiedendo, ma questo assomiglia molto a un problema XY . Perché è necessario individuare lo script utilizzando find? Una volta installato, sai dove si trova. Anche se lo aggiorni frequentemente e ne cambi il nome, puoi mantenerne un collegamento simbolico in modo che sia sempre disponibile con un nome fisso.
sleske,

5
@AFH Si prega di inviare le risposte come risposte, non commenti.
David Richerby,

1
@DavidRicherby - Volevo assicurarmi che questa fosse davvero la risposta prima di pubblicare. Ero perplesso che lo script avrebbe funzionato su file trovati all'interno di una directory arbitraria.
AFH,

Risposte:


45

Poiché la sostituzione del comando è racchiusa tra virgolette, viene valutata al momento della definizione del comando. Questo fa sì findche il contenuto del disco rigido .bashrcvenga visualizzato mentre è in esecuzione.

Al contrario, sembra che tu lo voglia valutare al momento dell'uso. In tal caso, utilizzare virgolette singole:

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

Nota che questo alias fallirà se uno qualsiasi dei file trovati ha uno spazio nei loro nomi. Per evitare ciò:

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

Quest'ultimo modulo funzionerà in modo affidabile per qualsiasi tipo di nome file.


1
"tempo di utilizzo". E la tua seconda riga evita di generare una subshell.
rleir,

11
Il rovescio della medaglia, ora ogni volta che si digita prog, finddovrebbe essere eseguito, mentre prima, dovrebbe essere eseguito solo una volta (all'avvio della shell).
el.pescado,

Inoltre, grazie alla memorizzazione dei file nella cache, la seconda volta che esegui lo stesso findè di solito molto più veloce.
reinierpost,

21
@ el.pescado Il lato positivo è difficile immaginare che il comportamento previsto sia quello di eseguire il comando sui file esistenti al momento in cui l'utente ha effettuato l'accesso, anziché sui file esistenti quando hanno eseguito il comando per elaborarli.
David Richerby,

2
@DavidRicherby Forse è possibile memorizzare nella cache il percorso proge rieseguirlo findse il vecchio percorso non esiste più?
Alex Vong,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.