ในโพสต์ล่าสุดของฉันเกี่ยวกับการตั้งค่า Ubuntu ด้วยสคริปต์ Bash ฉันพูดถึงความมหัศจรรย์ของ .bashrc
สั้น ๆ . สิ่งนี้ไม่ได้ทำเพื่อความยุติธรรม ดังนั้นนี่คือโพสต์ด่วนที่ให้รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่ไฟล์การกำหนดค่า Bash สามารถทำได้
การกำหนดค่าปัจจุบันของฉันช่วยปรับปรุงเวิร์กโฟลว์ของฉันอย่างมาก และช่วยฉันประหยัดกว่า 50% ของการกดแป้นที่ฉันจะต้องใช้หากไม่มีมัน! มาดูตัวอย่างชื่อแทน ฟังก์ชัน และการกำหนดค่าพร้อมท์ที่สามารถปรับปรุงเวิร์กโฟลว์ของเราโดยช่วยให้เรามีประสิทธิภาพมากขึ้นด้วยการกดปุ่มน้อยลง
ชื่อแทนการทุบตี
.bashrc
. ที่เขียนอย่างชาญฉลาด สามารถบันทึกการกดแป้นได้จำนวนมาก เราสามารถใช้ประโยชน์จากสิ่งนี้ในความหมายที่แท้จริงโดยใช้ bash aliases หรือสตริงที่ขยายเป็นคำสั่งที่ใหญ่ขึ้น สำหรับตัวอย่างที่บ่งบอก นี่คือ Bash alias สำหรับการคัดลอกไฟล์ในเทอร์มินัล:
# Always copy contents of directories (r)ecursively and explain (v) what was done
alias cp='cp -rv'
alias
คำสั่งกำหนดสตริงที่เราจะพิมพ์ ตามด้วยสิ่งที่สตริงนั้นจะขยายไป เราสามารถแทนที่คำสั่งที่มีอยู่เช่น cp
ข้างบน. ด้วยตัวของมันเอง cp
คำสั่งจะคัดลอกไฟล์เท่านั้น ไม่ใช่ไดเร็กทอรี และจะสำเร็จโดยไม่โต้ตอบ ด้วยนามแฝงนี้ เราไม่จำเป็นต้องส่งแฟล็กทั้งสองนั้น หรือ cd
หรือ ls
ตำแหน่งของไฟล์ที่เราคัดลอกมาเพื่อยืนยันว่ามี! ทีนี้ แค่กดปุ่มสองครั้งนั้น (สำหรับ c
และ d
) จะทำทุกอย่างเพื่อเรา
ต่อไปนี้เป็น .bashrc
. เพิ่มเติมบางส่วน นามแฝงสำหรับส่งแฟล็กที่มีฟังก์ชันทั่วไป
# List contents with colors for file types, (A)lmost all hidden files (without . and ..), in (C)olumns, with class indicators (F)
alias ls='ls --color=auto -ACF'
# List contents with colors for file types, (a)ll hidden entries (including . and ..), use (l)ong listing format, with class indicators (F)
alias ll='ls --color=auto -alF'
# Explain (v) what was done when moving a file
alias mv='mv -v'
# Create any non-existent (p)arent directories and explain (v) what was done
alias mkdir='mkdir -pv'
# Always try to (c)ontinue getting a partially-downloaded file
alias wget='wget -c'
นามแฝงมีประโยชน์เมื่อเราต้องการหลีกเลี่ยงการพิมพ์คำสั่งยาวๆ เช่นกัน ต่อไปนี้คือบางส่วนที่ฉันใช้เมื่อทำงานกับสภาพแวดล้อม Python:
alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'
สำหรับแรงบันดาลใจเพิ่มเติมเกี่ยวกับวิธีที่นามแฝงของ Bash สามารถประหยัดเวลาได้ ฉันขอแนะนำตัวอย่างในบทความนี้เป็นอย่างยิ่ง
ฟังก์ชันทุบตี
ข้อเสียประการหนึ่งของนามแฝงด้านบนคือค่อนข้างคงที่ - จะขยายเป็นข้อความที่ประกาศไว้เสมอ สำหรับ Bash alias ที่รับอาร์กิวเมนต์ เราจะต้องสร้างฟังก์ชัน เราสามารถทำได้ดังนี้:
# Show contents of the directory after changing to it
function cd () {
builtin cd "$1"
ls -ACF
}
เริ่มนับไม่ได้ว่าพิมพ์ cd
. ไปกี่ครั้งแล้ว แล้วก็ ls
ทันทีหลังจากที่เห็นเนื้อหาของไดเร็กทอรีที่ฉันอยู่ตอนนี้ ด้วยการตั้งค่าฟังก์ชันนี้ ทุกอย่างเกิดขึ้นด้วยตัวอักษรสองตัวนั้นเท่านั้น! ฟังก์ชันรับอาร์กิวเมนต์แรก $1
ในตำแหน่งที่จะเปลี่ยนไดเร็กทอรีเป็น จากนั้นพิมพ์เนื้อหาของไดเร็กทอรีนั้นในคอลัมน์ที่จัดรูปแบบอย่างสวยงามพร้อมตัวบ่งชี้ประเภทไฟล์ builtin
ส่วนหนึ่งจำเป็นต้องได้รับ Bash เพื่อให้เราสามารถแทนที่คำสั่งเริ่มต้นนี้ได้
ฟังก์ชัน Bash มีประโยชน์มากในการดาวน์โหลดหรืออัปเกรดซอฟต์แวร์ด้วย ก่อนหน้านี้ฉันใช้เวลาอย่างน้อยสองสามนาทีทุกสองสามสัปดาห์ในการดาวน์โหลด Hugo ตัวสร้างไซต์แบบคงที่เวอร์ชันขยายใหม่ ต้องขอบคุณความถี่ในการจัดส่งที่ยอดเยี่ยม ด้วยฟังก์ชัน ฉันต้องส่งผ่านเวอร์ชันเท่านั้น และการอัปเกรดจะเกิดขึ้นในไม่กี่วินาที
# Hugo install or upgrade
function gethugo () {
wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
sudo mv -f tmp/hugo /usr/local/bin/
rm -rf tmp/
hugo version
}
$@
สัญกรณ์ใช้อาร์กิวเมนต์ทั้งหมดที่กำหนดโดยแทนที่จุดในฟังก์ชัน ในการเรียกใช้ฟังก์ชันด้านบนและดาวน์โหลด Hugo เวอร์ชัน 0.57.2 เราใช้คำสั่ง gethugo 0.57.2
.
ฉันมีหนึ่งอันสำหรับ Golang ด้วย:
function getgolang () {
sudo rm -rf /usr/local/go
wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
rm -rf tmp/
go version
}
หรือฟังก์ชันที่เพิ่ม URL ต้นทางระยะไกลสำหรับ GitLab ไปยังที่เก็บปัจจุบันล่ะ
function glab () {
git remote set-url origin --add [email protected]:"$@"/"${PWD##*/}".git
git remote -v
}
ด้วย glab username
เราสามารถสร้าง origin
. ใหม่ได้ URL สำหรับที่เก็บ Git ปัจจุบันด้วย username
. ของเรา บน GitLab.com การพุชไปยัง URL ระยะไกลใหม่จะสร้างที่เก็บ GitLab ส่วนตัวใหม่โดยอัตโนมัติ ดังนั้นนี่จึงเป็นทางลัดที่มีประโยชน์สำหรับการสร้างข้อมูลสำรอง!
ฟังก์ชัน Bash นั้นถูกจำกัดด้วยความเป็นไปได้ของการเขียนสคริปต์เท่านั้น ซึ่งในทางปฏิบัตินั้นมีข้อ จำกัด เล็กน้อย หากมีสิ่งใดที่เราทำเป็นประจำซึ่งต้องพิมพ์สองสามบรรทัดลงในเทอร์มินัล เราอาจสร้างฟังก์ชัน Bash ขึ้นมาได้
พร้อมท์ทุบตี
นอกจากเนื้อหาของไดเร็กทอรีแล้ว การดูพาธแบบเต็มของไดเร็กทอรีที่เราอยู่นั้นยังมีประโยชน์อีกด้วย พรอมต์ของ Bash สามารถแสดงพาธนี้ให้เราดูพร้อมกับข้อมูลที่เป็นประโยชน์อื่นๆ เช่น สาขา Git ปัจจุบันของเรา เพื่อให้อ่านง่ายขึ้น เราสามารถกำหนดสีสำหรับแต่ละส่วนของพรอมต์ วิธีตั้งค่าพรอมต์ใน .bashrc
. มีดังนี้ เพื่อให้บรรลุสิ่งนี้:
# Colour codes are cumbersome, so let's name them
txtcyn='\[\e[0;96m\]' # Cyan
txtpur='\[\e[0;35m\]' # Purple
txtwht='\[\e[0;37m\]' # White
txtrst='\[\e[0m\]' # Text Reset
# Which (C)olour for what part of the prompt?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"
# Get the name of our branch and put parenthesis around it
gitBranch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# Build the prompt
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "
ผลลัพธ์:
~/github/myrepo (master) $
การตั้งชื่อสีช่วยให้ระบุได้ง่ายว่าสีหนึ่งเริ่มต้นและหยุดที่ใด และสีถัดไปเริ่มต้นที่ใด พรอมต์ที่เราเห็นในเทอร์มินัลของเราถูกกำหนดโดยสตริงที่ตามหลัง export PS1
โดยแต่ละองค์ประกอบของพรอมต์จะตั้งค่าด้วยลำดับหลีก มาทำลายมันกันเถอะ:
\w
แสดงไดเร็กทอรีการทำงานปัจจุบัน\$(gitBranch)
เรียกgitBranch
ฟังก์ชั่นที่กำหนดไว้ข้างต้น ซึ่งแสดงสาขา Git ปัจจุบัน\$
จะแสดง “$” หากคุณเป็นผู้ใช้ปกติหรือในโหมดผู้ใช้ปกติ และ “#” หากคุณเป็นผู้ใช้ root
รายการทั้งหมดของ Bash Escape Sequence สามารถช่วยให้เราแสดงข้อมูลได้อีกมากมาย แม้กระทั่งเวลาและวันที่! ข้อความแจ้งของ Bash นั้นปรับแต่งได้สูงและเป็นรายบุคคล ดังนั้นคุณสามารถตั้งค่าได้ตามต้องการ
ต่อไปนี้คือตัวเลือกบางส่วนที่ให้ข้อมูลตรงจุดและช่วยให้เราทำงานได้อย่างมีประสิทธิภาพมากขึ้น
สำหรับคนผัดวันประกันพรุ่ง
ชื่อผู้ใช้และเวลาปัจจุบันเป็นวินาที ในรูปแบบ 24 ชั่วโมง HH:MM:SS:
export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >
สำหรับคนที่ชอบรู้ว่าตัวเองยืนอยู่ตรงไหน
เส้นทางไฟล์แบบเต็มในบรรทัดแยก และชื่อผู้ใช้:
export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo
user:
สำหรับคนมินิมอล
export PS1=">"
>
เราสามารถสร้างข้อความแจ้งที่ใช้งานได้จริงมากมายโดยใช้เพียงแค่ Escape Sequence พื้นฐาน เมื่อเราเริ่มผสานรวมฟังก์ชันกับพรอมต์ เช่นในตัวอย่างสาขา Git สิ่งต่างๆ อาจซับซ้อนมาก ความซับซ้อนจำนวนนี้เป็นส่วนเสริมหรือส่งผลเสียต่อประสิทธิภาพการทำงานของคุณ มีเพียงคุณเท่านั้นที่รู้ได้อย่างแน่นอน!
พร้อมท์ Bash แฟนซีจำนวนมากเป็นไปได้ด้วยโปรแกรมที่พร้อมใช้งานพร้อมการค้นหาอย่างรวดเร็ว ฉันไม่ได้ตั้งใจให้ตัวอย่างที่นี่ เพราะถ้าคุณมักจะตื่นเต้นกับสิ่งนี้ให้ได้มากที่สุด อาจต้องใช้เวลาสองสามชั่วโมงก่อนที่คุณจะกลับไปทำสิ่งที่คุณทำก่อนที่คุณจะเริ่มอ่านโพสต์นี้ และ ฉันไม่สามารถมีสิ่งนั้นได้ในมโนธรรมของฉัน ?
หวังว่าเราจะมีความสมดุลที่ดีในขณะนี้ระหว่างเวลาที่ลงทุนไปและประโยชน์ที่ได้รับจากไฟล์การกำหนดค่า Bash ของเรา! ฉันหวังว่าคุณจะใช้ความสามารถในการกดแป้นพิมพ์ที่กู้คืนใหม่ของคุณให้ดี