Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

วิธีใช้ไฟล์ .bashrc ของคุณให้มากเป็นสองเท่าด้วยการกดแป้นพิมพ์ครึ่งหนึ่ง

ในโพสต์ล่าสุดของฉันเกี่ยวกับการตั้งค่า 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 git@gitlab.com:"$@"/"${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 ของเรา! ฉันหวังว่าคุณจะใช้ความสามารถในการกดแป้นพิมพ์ที่กู้คืนใหม่ของคุณให้ดี