Bash tarda en iniciarse debido a esta línea en .bashrc. Que podria causar esto?

19

Mi .bashrcarchivo contiene una línea a este efecto:

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

Cuando comento esta línea, Bash comienza casi instantáneamente cuando abro una nueva terminal. Con esta línea, hay un retraso de 4-5 segundos antes de que aparezca mi cursor.

Eliminar los comandos anidados $(pwd), etc., también lo acelera nuevamente. ¿Por qué está pasando esto? ¿Puedo seguir usando comandos anidados de alguna manera?

BBales
fuente
44
El problema es el findcomando, que se ejecuta en el momento del arranque y puede tardar mucho tiempo en ejecutarse, dependiendo de la estructura del directorio. Si usa comillas simples en lugar de comillas dobles, findse ejecutará en tiempo de ejecución, cuando aliasse invoca. Depende del directorio de trabajo que desee usar, el actual en el momento de la declaración o el tiempo de ejecución. Por cierto, $(pwd)es una forma bastante ineficiente de expresar .o $PWD.
AFH
15
Sé que eso no es lo que estás preguntando, pero esto se parece mucho a un problema XY . ¿Por qué necesitas localizar el script usando find? Una vez que lo instaló, ya sabe dónde está. Incluso si lo actualiza con frecuencia y cambia su nombre, puede mantener un enlace simbólico para que siempre esté disponible con un nombre fijo.
sleske
55
@ AFF Por favor, publique las respuestas como respuestas, no como comentarios.
David Richerby
1
@DavidRicherby: quería asegurarme de que esta fuera la respuesta antes de publicar. Me sorprendió que el script funcionara en archivos encontrados dentro de un directorio arbitrario.
AFH

Respuestas:

45

Debido a que la sustitución del comando está entre comillas dobles, se evalúa en el momento en que se define el comando. Esto hace findque revise el contenido de su disco duro mientras se .bashrcestá ejecutando.

Por el contrario, parece querer evaluarlo en el momento de su uso. En ese caso, use comillas simples:

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

Tenga en cuenta que este alias fallará si alguno de los archivos encontrados tiene espacios en blanco en sus nombres. Para evitar eso:

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

Este último formulario funcionará de manera confiable para cualquier tipo de nombre de archivo.

John1024
fuente
1
'tiempo de uso'. Y su segunda línea evita generar una subshell.
Rleir
11
En el lado negativo, ahora cada vez que escribe prog, finddebería ejecutarse, mientras que antes, solo se ejecutaría una vez (en el inicio del shell).
el.pescado
Por otra parte, debido al almacenamiento en caché de archivos, la segunda vez que ejecuta el mismo findsuele ser mucho más rápido.
reinierpost
21
@ el.pescado Por el lado positivo, es difícil imaginar que el comportamiento previsto sea ejecutar el comando en los archivos que existían en el momento en que el usuario inició sesión, en lugar de los archivos que existían cuando ejecutaron el comando para procesarlos.
David Richerby
2
@DavidRicherby ¿Quizás podamos almacenar en caché la ruta progy volver a ejecutarla findsi la ruta anterior ya no existe?
Alex Vong