Sådan bruges din .bashrc-fil til at gøre dobbelt så meget med halvt tastetryk

I mit seneste indlæg om oprettelse af Ubuntu med Bash-scripts henviste jeg kort til magien ved .bashrc. Dette gjorde det ikke rigtig retfærdigt, så her er et hurtigt indlæg, der giver lidt flere detaljer om, hvad Bash-konfigurationsfilen kan gøre.

Min nuværende konfiguration forbedrer min arbejdsgang enormt og sparer mig godt over 50% af de tastetryk, jeg skulle bruge uden den! Lad os se på nogle eksempler på aliaser, funktioner og hurtige konfigurationer, der kan forbedre vores arbejdsgang ved at hjælpe os med at være mere effektive med færre tastetryk.

Bash-aliasser

En smart skrevet .bashrckan gemme en hel masse tastetryk. Vi kan drage fordel af dette i bogstavelig forstand ved at bruge bash-aliasser eller strenge, der udvides til større kommandoer. For et vejledende eksempel er her et Bash-alias til kopiering af filer i terminalen:

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

Den aliaskommando definerer strengen vi skriver, efterfulgt af hvad denne streng vil vokse til. Vi kan tilsidesætte eksisterende kommandoer som cpovenfor. På egen hånd vil cpkommandoen kun kopiere filer, ikke mapper, og det lykkes lydløst. Med dette alias behøver vi ikke at huske at videregive disse to flag cdeller lsplaceringen af ​​vores kopierede fil eller bekræfte, at den er der! Nu skal bare disse to tastetryk (for cog d) gøre alt dette for os.

Her er et par flere .bashrcaliasser til at sende flag med fælles funktioner.

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

Aliaser er nyttige, når vi også vil undgå at skrive lange kommandoer. Her er et par, jeg bruger, når jeg arbejder med Python-miljøer:

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

For yderligere inspiration til måder Bash-aliasser kan spare tid, anbefaler jeg stærkt eksemplerne i denne artikel.

Bash-funktioner

En ulempe ved aliaserne ovenfor er, at de er ret statiske - de udvides altid til nøjagtigt den erklærede tekst. For et Bash-alias, der tager argumenter, skal vi oprette en funktion. Vi kan gøre dette sådan:

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

Jeg kan ikke begynde at tælle, hvor mange gange jeg har skrevet, cdog derefter lsumiddelbart efter for at se indholdet af den mappe, jeg nu er i. Med denne funktion opsat, sker det hele med bare de to bogstaver! Funktionen tager det første argument, $1som placeringen for at skifte mappe til, og udskriver derefter indholdet af den mappe i pænt formaterede kolonner med filtypeindikatorer. Den builtindel er nødvendig for at få Bash at tillade os at tilsidesætte denne standard kommando.

Bash-funktioner er også meget nyttige, når det kommer til at downloade eller opgradere software. Jeg har tidligere brugt mindst et par minutter hvert par uger på at downloade den nye udvidede version af den statiske stedgenerator Hugo takket være deres fremragende leveringsfrekvens. Med en funktion behøver jeg kun at videregive versionen, og opgraderingen sker om få sekunder.

# Hugo install or upgrade function gethugo () { wget -q -P tmp/ //github.com/gohugoio/hugo/releases/download/v"[email protected]"/hugo_extended_"[email protected]"_Linux-64bit.tar.gz tar xf tmp/hugo_extended_"[email protected]"_Linux-64bit.tar.gz -C tmp/ sudo mv -f tmp/hugo /usr/local/bin/ rm -rf tmp/ hugo version }

Den [email protected]notation simpelthen tager alle argumenter givet, at erstatte sin plads i funktionen. For at køre ovenstående funktion og downloade Hugo version 0.57.2 bruger vi kommandoen gethugo 0.57.2.

Jeg har også en til Golang:

function getgolang () { sudo rm -rf /usr/local/go wget -q -P tmp/ //dl.google.com/go/go"[email protected]".linux-amd64.tar.gz sudo tar -C /usr/local -xzf tmp/go"[email protected]".linux-amd64.tar.gz rm -rf tmp/ go version }

Eller hvad med en funktion, der føjer en fjern oprindelses-URL til GitLab til det aktuelle arkiv?

function glab () { git remote set-url origin --add [email protected]:"[email protected]"/"${PWD##*/}".git git remote -v }

Med glab usernamekan vi oprette en ny originURL til det aktuelle Git-arkiv med vores usernamepå GitLab.com. Ved at skubbe til en ny ekstern URL oprettes automatisk et nyt privat GitLab-arkiv, så dette er en nyttig genvej til oprettelse af sikkerhedskopier!

Bash-funktioner er virkelig kun begrænset af mulighederne for scripting, hvoraf der praktisk talt er få grænser. Hvis der ofte er noget, vi laver, der kræver at skrive et par linjer i en terminal, kan vi sandsynligvis oprette en Bash-funktion til det!

Bash-prompt

Udover bibliotekets indhold er det også nyttigt at se den fulde sti til det bibliotek, vi er i. Bash-prompten kan vise os denne sti sammen med andre nyttige oplysninger som vores nuværende Git-gren. For at gøre det mere læsbart kan vi definere farver for hver del af prompten. Sådan kan vi konfigurere vores prompt til .bashrcat opnå dette:

# 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()  sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'  # Build the prompt export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "

Resultat:

~/github/myrepo (master) $

Navngivning af farverne hjælper med let at identificere, hvor en farve starter og stopper, og hvor den næste begynder. Prompten, som vi ser i vores terminal, er defineret af strengen, der følger export PS1, med hver komponent i prompten angivet med en escape-sekvens. Lad os nedbryde det:

  • \w viser den aktuelle arbejdsmappe,
  • \$(gitBranch)kalder gitBranchfunktionen defineret ovenfor, som viser den aktuelle Git-gren,
  • \$ viser en "$", hvis du er en normal bruger eller i normal brugertilstand, og et "#", hvis du er root.

Den fulde liste over Bash escape-sekvenser kan hjælpe os med at vise mange flere informationsbits, inklusive selv tid og dato! Bash-prompter er meget tilpasselige og individuelle, så du er velkommen til at konfigurere det, som du vil.

Her er et par muligheder, der sætter information foran og i centrum og kan hjælpe os med at arbejde mere effektivt.

For den udsættende-modvillige

Brugernavn og aktuelt tidspunkt med sekunder i 24-timers HH: MM: SS-format:

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

For dem der altid kan lide at vide, hvor de står

Fuld filsti på en separat linje og brugernavn:

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

For det minimalistiske

export PS1=">"
>

We can build many practical prompts with just the basic escape sequences; once we start to integrate functions with prompts, as in the Git branch example, things can get really complicated. Whether this amount of complication is an addition or a detriment to your productivity, only you can know for sure!

Many fancy Bash prompts are possible with programs readily available with a quick search. I’ve intentionally not provided samples here because, well, if you can tend to get as excited about this stuff as I can, it might be a couple hours before you get back to what you were doing before you started reading this post, and I just can’t have that on my conscience. ?

We’ve hopefully struck a nice balance now between time invested and usefulness gained from our Bash configuration file! I hope you use your newly-recovered keystroke capacity for good.