bashrc ขี้เกียจทดแทน


10

เราจะได้รับ~/.bashrcชื่อแทนเพื่อประเมินการ$()ทดแทนในเวลาทำงานแทนที่จะเป็นช่วงเวลาที่ดำเนินการ ~ / .bashrc (เมื่อเปิดเทอร์มินัล)?

ฉันรันคำสั่งนี้บ่อยพอที่ฉันต้องการเพิ่มนามแฝง:

svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff

อย่างไรก็ตามเมื่อฉันเพิ่มลง~/.bashrcในนามแฝงฉันเห็นว่าการประเมินผลนั้นได้รับการกำหนดค่าตายตัวในค่าที่พวกเขามีในขณะที่ฉันเปิดเทอร์มินัล:

$ alias
alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff'

ถ้าฉันเปิดเทอร์มินัล~ฉันจะได้รับข้อผิดพลาด:

svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
$ alias
alias svnbranch='svn diff -r :HEAD  | colordiff'
$

ฉันได้ลองใช้นามแฝงสองรูปแบบทั้งสองแบบนี้~/.bashrcมีผลเหมือนกัน (ตามที่ฉันคาดไว้):

alias svnbranch="svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff"
alias svnbranch="svn diff -r `svn info | grep ^Revision | awk {'print $2'}`:HEAD `svn info | grep ^URL | awk {'print $2'}` | colordiff"

หนึ่งจะได้รับ~/.bashrcชื่อแทนในการประเมินการ$()ทดแทนในเวลาทำงาน ?

นอกจากนี้หนึ่งจะค้นหาสถานการณ์นี้ใน Google อย่างไร ฉันพยายาม google บน "bashrc substit", "bashrc lazy substit" และวลีสำคัญอื่น ๆ แต่ฉันไม่พบสิ่งที่ฉันคิดว่าน่าจะเป็นปัญหาที่พบได้บ่อยพอที่จะหาข้อมูล


2
ทำไมต้องเป็นนามแฝง ย้ายไปที่เชลล์สคริปต์และทำได้ด้วย ระบบประเภท * ix ส่วนใหญ่จะใส่$HOME/binลงไปPATHหากคุณมีไดเรกทอรีเช่นนี้
Warren Young

@WarrenYoung: คุณถูกต้องอินสแตนซ์เฉพาะนี้อาจเป็นสคริปต์ อย่างไรก็ตามฉันยังต้องการทราบคำตอบในขณะที่ฉันชอบชื่อแทนสำหรับสิ่งอื่น ๆ และฉันจะพบกับสิ่งนี้อย่างแน่นอน ฉันสามารถทำให้คำถามของคุณเป็นเรื่องทั่วไป "ทำไม Bash จึงสนับสนุนนามแฝงเมื่ออะไรก็ตามอาจเป็นสคริปต์"
dotancohen

ทำไมต้องลงคะแนน? ฉันจะปรับปรุงคำถามได้อย่างไร ฉันได้ให้ตัวอย่างความพยายามที่ล้มเหลวและแม้แต่วลีสำคัญที่ฉันพยายาม google
dotancohen

@dotancohen: ฉันคิดว่าคุณควรถามแยกต่างหาก alias cdp="cd ~/projects"ฉันจะให้คำตอบบางส่วนที่นี่: ไม่สามารถทำได้ในเชลล์สคริปต์
Warren Young

คำตอบ:


11

ใช้เครื่องหมายคำพูดเดี่ยวเพื่อระงับการประมวลผลอักขระพิเศษ นอกจากนี้คุณยังสามารถทับขวา s $

สำหรับคำสั่งที่ซับซ้อนคุณน่าจะดีกว่าการใช้ฟังก์ชั่นในกรณีใด ๆ ซึ่งไม่ต้องการการหลบหนีและง่ายต่อการอ่านและแก้ไข:

svnbranch() {
    svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff
}

คุณสามารถกำหนดฟังก์ชั่นได้ทุกที่ที่คุณสามารถกำหนดนามแฝง


2
awkมีพื้นที่รูปแบบเช่นกันawk '/^Revision/{ print ...}' ดังนั้นจึงไม่จำเป็นต้องใช้ grep ในกรณีนี้
Valentin Bajrami
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.