Bash lambat untuk memulai karena baris ini di .bashrc. Apa yang bisa menyebabkan ini?

19

.bashrcFile saya berisi garis ke efek ini:

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

Ketika saya mengomentari baris ini, Bash memulai hampir secara instan ketika saya membuka terminal baru. Dengan baris ini, ada penundaan 4-5 detik sebelum kursor saya muncul.

Menghapus perintah bersarang $(pwd), dll. Mempercepatnya lagi juga. Mengapa ini terjadi? Apakah saya masih bisa menggunakan perintah bersarang?

BBales
sumber
4
Masalahnya adalah findperintah, yang dieksekusi pada saat boot dan dapat memakan waktu lama untuk dieksekusi, tergantung pada struktur direktori. Jika Anda menggunakan tanda kutip tunggal dan bukan tanda kutip ganda, findakan dieksekusi pada saat run time, ketika aliasdijalankan. Itu tergantung pada direktori kerja yang ingin Anda gunakan, yang saat ini pada saat deklarasi, atau pada saat dijalankan Omong-omong $(pwd)adalah cara yang agak tidak efisien untuk mengekspresikan .atau $PWD.
AFH
15
Saya tahu bukan itu yang Anda tanyakan, tetapi ini sangat mirip dengan masalah XY . Mengapa Anda perlu mencari skrip menggunakan find? Setelah Anda menginstalnya, Anda tahu di mana itu. Bahkan jika Anda sering memperbaruinya dan mengubah namanya, Anda dapat mempertahankan tautan simbolik agar selalu tersedia dengan nama tetap.
sleske
5
@AFH Silakan kirim jawaban sebagai jawaban, bukan komentar.
David Richerby
1
@ DavidRicherby - Saya ingin memastikan bahwa ini memang jawabannya sebelum memposting. Saya bingung bahwa skrip akan bekerja pada file yang ditemukan dalam direktori arbitrer.
AFH

Jawaban:

45

Karena substitusi perintah berada di dalam tanda kutip ganda, ia dievaluasi pada saat perintah tersebut didefinisikan. Ini menyebabkan finduntuk melihat isi hard disk Anda saat .bashrcsedang berjalan.

Anda, sebaliknya, tampaknya ingin itu dievaluasi pada saat digunakan. Dalam hal ini, gunakan tanda kutip tunggal:

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

Perhatikan bahwa alias ini akan gagal jika ada file yang ditemukan memiliki spasi putih di namanya. Untuk menghindari itu:

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

Bentuk yang terakhir ini akan bekerja dengan andal untuk segala jenis nama file.

John1024
sumber
1
'waktu penggunaan'. Dan baris kedua Anda menghindari menelurkan subkulit.
rleir
11
Pada sisi negatifnya, sekarang setiap kali Anda mengetik prog, findakan perlu dijalankan, sedangkan sebelumnya, itu akan dijalankan hanya sekali (pada shell startup).
el.pescado
Kemudian lagi, karena file caching, kedua kalinya Anda menjalankan yang sama findbiasanya jauh lebih cepat.
reinierpost
21
@ el.pescado Sisi baiknya, sulit untuk membayangkan bahwa perilaku yang dimaksud adalah menjalankan perintah pada file yang ada pada saat pengguna login, daripada file yang ada saat mereka menjalankan perintah untuk memprosesnya.
David Richerby
2
@ DavidRicherby Mungkin kita bisa men-cache jalan progdan menjalankan kembali findjika jalan lama tidak ada lagi?
Alex Vong