Bash ช้าในการเริ่มต้นเนื่องจากบรรทัดนี้ใน. bashrc อะไรทำให้เกิดสิ่งนี้


19

.bashrcไฟล์ของฉันมีบรรทัดที่มีเอฟเฟกต์นี้:

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

เมื่อฉันแสดงความคิดเห็นในบรรทัดนี้ Bash จะเริ่มต้นเกือบทันทีเมื่อฉันเปิดเครื่องใหม่ ด้วยบรรทัดนี้มีความล่าช้า 4-5 วินาทีก่อนที่เคอร์เซอร์ของฉันจะปรากฏขึ้น

การลบคำสั่งที่ซ้อนอยู่$(pwd)ฯลฯ จะเพิ่มความเร็วขึ้นอีกครั้งเช่นกัน ทำไมสิ่งนี้จึงเกิดขึ้น ฉันยังสามารถใช้คำสั่งที่ซ้อนอยู่ได้ไหม?


4
ปัญหาคือfindคำสั่งซึ่งจะดำเนินการในเวลาบูตและอาจใช้เวลานานในการดำเนินการขึ้นอยู่กับโครงสร้างไดเรกทอรี หากคุณใช้ single- แทนเครื่องหมายคำพูดคู่findจะถูกดำเนินการในเวลาทำงานเมื่อaliasมีการเรียกใช้ ขึ้นอยู่กับไดเรกทอรีทำงานที่คุณต้องการใช้กระแสนั้น ณ เวลาที่ประกาศหรือ ณ เวลาทำงาน โดยวิธีการที่$(pwd)เป็นวิธีที่ค่อนข้างไม่มีประสิทธิภาพในการแสดงหรือ. $PWD
AFH

15
ฉันรู้ว่านั่นไม่ใช่สิ่งที่คุณถาม แต่มันดูเหมือนปัญหา XYมาก ทำไมคุณต้องค้นหาสคริปต์ที่ใช้find? เมื่อคุณติดตั้งแล้วคุณจะรู้ว่ามันอยู่ที่ไหน แม้ว่าคุณจะอัปเดตเป็นประจำและเปลี่ยนชื่อคุณสามารถรักษาลิงก์สัญลักษณ์ไว้เพื่อให้สามารถใช้งานได้ภายใต้ชื่อคงที่
sleske

5
@AFH โปรดโพสต์คำตอบเป็นคำตอบไม่ใช่ความคิดเห็น
David Richerby

1
@ DavidRicherby - ฉันต้องการให้แน่ใจว่านี่เป็นคำตอบที่แน่นอนก่อนที่จะโพสต์ ฉันงงว่าสคริปต์จะทำงานกับไฟล์ที่พบในไดเรกทอรีโดยพลการ
AFH

คำตอบ:


45

เนื่องจากการทดแทนคำสั่งอยู่ในเครื่องหมายคำพูดคู่จึงได้รับการประเมิน ณ เวลาที่คำสั่งถูกกำหนด สิ่งนี้ทำให้findมองผ่านเนื้อหาฮาร์ดดิสก์ของคุณในขณะที่.bashrcทำงาน

ในทางตรงกันข้ามคุณต้องการให้ประเมินในเวลาที่ใช้ ในกรณีนั้นใช้เครื่องหมายคำพูดเดี่ยว:

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

โปรดทราบว่านามแฝงนี้จะล้มเหลวหากไฟล์ใด ๆ ที่พบมีช่องว่างในชื่อของพวกเขา เพื่อหลีกเลี่ยงสิ่งนั้น:

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

รูปแบบหลังนี้จะทำงานได้อย่างน่าเชื่อถือสำหรับชื่อไฟล์ทุกชนิด


1
'เวลาใช้งาน' และบรรทัดที่สองของคุณหลีกเลี่ยงการวางไข่ subshell
rleir

11
ในข้อเสียตอนนี้เวลาที่คุณพิมพ์ทุกprog, findจะต้องมีการทำงานในขณะที่ก่อนก็จะถูกเรียกใช้เพียงครั้งเดียว (ในการเริ่มต้นเปลือก)
el.pescado

จากนั้นอีกครั้งเนื่องจากไฟล์แคชครั้งที่สองที่คุณเรียกใช้เหมือนกันfindโดยทั่วไปจะเร็วกว่ามาก
reinierpost

21
@ el.pescado กลับหัวกลับหางยากที่จะจินตนาการว่าพฤติกรรมที่ตั้งใจคือการรันคำสั่งในไฟล์ที่มีอยู่ในเวลาที่ผู้ใช้เข้าสู่ระบบมากกว่าไฟล์ที่มีอยู่เมื่อพวกเขาดำเนินการคำสั่งในการประมวลผล
David Richerby

2
@DavidRicherby บางทีเราสามารถแคชเส้นทางprogและเรียกใช้ซ้ำได้findหากเส้นทางเก่าไม่มีอยู่อีกต่อไป
Alex Vong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.