In al meu post recent despre configurarea Ubuntu cu scripturi Bash, Am aludat pe scurt la magia .bashrc. Acest lucru nu i-a făcut dreptate, așa că iată o postare rapidă care oferă ceva mai multe detalii despre ceea ce poate face fișierul de configurare Bash.

Configurația mea actuală îmi îmbunătățește enorm fluxul de lucru și mă economisește cu mult peste 50% din apăsările de taste pe care ar trebui să le folosesc fără ea! Să vedem câteva exemple de aliasuri, funcții și configurații prompte care ne pot îmbunătăți fluxul de lucru, ajutându-ne să fim mai eficienți cu mai puține apăsări de taste.

Bash aliases

Un scris inteligent .bashrc poate salva o mulțime de apăsări de taste. Putem profita de acest lucru în sens literal folosind aliasuri bash, sau șiruri care se extind la comenzi mai mari. Pentru un exemplu orientativ, iată un alias Bash pentru copierea fișierelor în terminal:

# Always copy contents of directories (r)ecursively and explain (v) what was done
alias cp='cp -rv'

alias comanda definește șirul pe care îl vom tasta, urmat de la ce se va extinde acel șir. Putem suprascrie comenzile existente cum ar fi cp de mai sus. De unul singur, cp comanda va copia doar fișiere, nu directoare și reușește în tăcere. Cu acest alias, nu trebuie să ne amintim să trecem aceste două steaguri și nici cd sau ls locația fișierului nostru copiat pentru a confirma că este acolo! Acum, doar acele două apăsări de taste (pt c și d) va face toate acestea pentru noi.

Iată câteva altele .bashrc aliasuri pentru trecerea steagurilor cu funcții comune.

# 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"

Aliasurile sunt la îndemână atunci când vrem să evităm să tastăm și comenzi lungi. Iată câteva pe care le folosesc când lucrez cu medii Python:

alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'

Pentru inspirație suplimentară asupra modurilor în care pseudonimele Bash pot economisi timp, vă recomand cu tărie exemplele din acest articol.

Funcții Bash

Un dezavantaj al aliasurilor de mai sus este că sunt destul de statice – se vor extinde întotdeauna exact la textul declarat. Pentru un alias Bash care acceptă argumente, va trebui să creăm o funcție. Putem face acest lucru astfel:

# Show contents of the directory after changing to it
function cd () {
    builtin cd "$1"
    ls -ACF
}

Nu pot începe să calculez de câte ori am tastat cd și apoi ls imediat după ce am văzut conținutul directorului în care sunt acum. Cu această funcție configurată, totul se întâmplă doar cu acele două litere! Funcția ia primul argument, $1, ca locație pentru a schimba directorul, apoi imprimă conținutul acelui director în coloane frumos formatate cu indicatori de tip fișier. builtin parte este necesară pentru ca Bash să ne permită să anulăm această comandă implicită.

Funcțiile Bash sunt foarte utile și atunci când vine vorba de descărcarea sau actualizarea software-ului. Anterior am petrecut cel puțin câteva minute la fiecare câteva săptămâni descărcând noua versiune extinsă a generator de site static Hugo, datorită frecvenței lor excelente de expediere. Cu o funcție, trebuie să trec doar în versiune, iar actualizarea are loc în câteva secunde.

# 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
}

$@ notația ia pur și simplu toate argumentele date, înlocuindu-și locul din funcție. Pentru a rula funcția de mai sus și a descărca Hugo versiunea 0.57.2, folosim comanda gethugo 0.57.2.

Am unul pentru Golang, de asemenea:

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
}

Sau ce zici de o funcție care adaugă o adresă URL de origine la distanță pentru GitLab la depozitul curent?

function glab () {
    git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git
    git remote -v
}

Cu glab username, putem crea un nou origin Adresa URL pentru depozitul Git curent cu username pe GitLab.com. Apăsarea către o nouă adresă URL la distanță creează automat un nou depozit GitLab privat, deci aceasta este o comandă rapidă utilă pentru crearea copiilor de rezervă!

Funcțiile Bash sunt într-adevăr limitate doar de posibilitățile de scriptare, dintre care există, practic, puține limite. Dacă facem ceva frecvent, care necesită tastarea câtorva linii într-un terminal, probabil că putem crea o funcție Bash pentru aceasta!

Prompt Bash

Pe lângă conținutul directorului, este de asemenea util să vedeți calea completă a directorului în care ne aflăm. Solicitarea Bash ne poate arăta această cale, împreună cu alte informații utile, cum ar fi ramura noastră actuală Git. Pentru ao face mai ușor de citit, putem defini culorile pentru fiecare parte a promptului. Iată cum ne putem configura promptul în .bashrc pentru a realiza acest lucru:

# 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} "

Rezultat:

~/github/myrepo (master) $

Denumirea culorilor vă ajută să identificați cu ușurință unde începe și se oprește o culoare și unde începe următoarea culoare. Solicitarea pe care o vedem în terminalul nostru este definită de șirul următor export PS1, cu fiecare componentă a promptului setată cu un secvență de evadare. Să descompunem asta:

  • w afișează directorul de lucru curent,
  • $(gitBranch) apelează gitBranch funcția definită mai sus, care afișează ramura Git curentă,
  • $ va afișa un „$” dacă sunteți un utilizator normal sau în modul normal de utilizator și un „#” dacă sunteți root.

lista completă a secvențelor de evadare Bash ne poate ajuta să afișăm mai multe informații, inclusiv ora și data! Solicitările Bash sunt extrem de personalizabile și individuale, așa că nu ezitați să le configurați în orice mod doriți.

Iată câteva opțiuni care plasează informațiile în centrul atenției și ne pot ajuta să lucrăm mai eficient.

Pentru amânare-avers

Numele de utilizator și ora curentă cu secunde, în format HH: MM: SS de 24 de ore:

export PS1="${userC}u ${normalC}at t >"
user at 09:35:55 >

Pentru cei cărora le place întotdeauna să știe unde se află

Calea completă a fișierului pe o linie separată și numele de utilizator:

export PS1="${pathC}w${normalC}nu:"
~/github/myrepo
user:

Pentru minimalist

export PS1=">"
>

Putem construi multe solicitări practice doar cu secvențele de evadare de bază; odată ce începem să integrăm funcțiile cu solicitări, ca în exemplul ramurii Git, lucrurile se pot complica cu adevărat. Indiferent dacă această complicație este un plus sau un detriment pentru productivitatea dvs., numai dvs. puteți ști cu siguranță!

Multe solicitări fanteziste Bash sunt posibile cu programe disponibile cu ușurință, cu o căutare rapidă. Nu am oferit în mod intenționat mostre aici, pentru că, bine, dacă poți tinde să devii cât mai entuziasmat de aceste lucruri, pot trece câteva ore înainte să revii la ceea ce făceai înainte să începi să citești această postare și Pur și simplu nu pot avea asta pe conștiință. ?

Sperăm că am obținut un echilibru frumos între timpul investit și utilitatea câștigată din fișierul nostru de configurare Bash! Sper să-ți folosești definitiv capacitatea de tastare recent recuperată.