Bash 201: Guide Intermediate å Bash

I forrige uke tok vi en titt på noen av de grunnleggende bruk GNU bash shell. Selvfølgelig, det er ikke alt som er å bli kjent med veien rundt skallet.

Her vil vi ta en titt på konfigurering bash, sette aliaser, og et par andre tips og triks for å bli kjent med din skall. Læring veien rundt skallet er en maraton, ikke en sprint, så vi får prøve å ta det i små håndterbare biter.



Konfigurering Bash

Som nevnt i forrige tutorial, har bash flere konfigurasjonsfiler den leser når du starter opp, avhengig av hvordan det begynner. Hvis du starter som login skall, vil bash lese følgende i rekkefølge:

/etc /profile

~ /.bash_profile

~ /.bash_login

~ /.profile

Hvis bash starter som en ikke-login shell, for eksempel når du åpner en terminal emulator som Konsole eller GNOME Terminal, så det ser ut på følgende filer:

/etc/bash.bashrc

~ /.bashrc

En rask påminnelse, er tilde (~) stenografi for ditt hjemmeområde. Så ~ /.bashrc utvides til /home/user/.bashrc når tolket av skallet.

For å gjøre endringer i skallet, da, vil du ønsker å endre ~ /.bash_profile å endre login shell og ~ /.bashrc for den ikke-login shell

La oss se på et enkelt bash konfigurasjonsfil.

 # Sett din favoritt editor hereexport EDITOR = /usr /bin /vim # Set aliasesif [-f ~ /.bash_aliases]; da     . ~ /.bash_aliasesfi 

​​Linjene innledes med hashes (#) er kommentarer. Skallet vil ignorere dem. Den neste linjen setter EDITOR miljøvariabelen til vim. Bash ser på dette for å se hva redaktøren skal brukes som standard

Som forklart litt mer nedenfor, de neste linjene forteller bash til ". Kilde " en fil for å lese aliaser hvis fil- .bash_aliases eksisterer. Det sannsynligvis ser litt kryptisk, men linjen ". ~ /.bash_aliases " betyr " source ~ /.bash_aliases ".

stien til kommandoer

Når du skriver en kommando på skallet, ser bash i spesifikke kataloger for å se om det kan finne kommandoen. Så hvis du skriver ls på skallet, vil bash bare kjøre kommandoen hvis det er på sin vei, og vil mislykkes hvis kommandoen ikke blir funnet i en av mappene som er en del av banen. Hvis det er en kamp i mer enn en av mappene i banen, plukker bash den første

Du kan finne ut hva din sti er ved å kjøre.

 echo $ PATH 

Du skal se noe sånt this:

/home/jzb/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/bin

Hver katalog hvor bash ser er atskilt med et kolon. Legg merke til at den første katalogen bash vil sjekke er " bin " katalog i min hjemmekatalog, deretter /usr /local /bin, /usr /bin, og så videre. Hvis du er logget inn i systemet som root, skal du se et annet sett med kataloger inkludert /usr /local /sbin, /usr /sbin, og så videre.

Du kan legge til kataloger til banen eller endre banen ved å redigere din ~ /.bashrc og ~ /.bash_profile, som så:

 PATH = " $ HOME /bin: $ PATH " 

La oss bryte det ned litt. PATH = forteller bash at det kommer til å være å sette din vei, og deretter $ HOME /bin forteller det å legge til bin-katalogen, og deretter $ PATH forteller bash å legge til hva er allerede i banen. The: er en separator mellom oppføringene

Du har kanskje allerede har noe sånt som dette i ~ /.bash_profile og /eller ~ /.bashrc.

 hvis [-d " $ HOME /bin " ]; deretter PATH = " $ HOME /bin: $ PATH " fi 

​​Det tester for å se om bin eksisterer i ditt hjemmeområde, og deretter legger det til banen. Vi dekker betinget utsagn og enkel scripting i en annen tutorial, som det er litt utenfor rammen av denne opplæringen.

aliaser

Et alias er en streng som bash vil bytte ut for en annen kommando . Et enkelt eksempel:

 alias ls = 'ls --color = auto' 

Dette forteller bash " når jeg kjører 'ls' jeg faktisk ønsker å kjøre 'ls --color = auto ", men føler ikke at å skrive alt det der.

Du kan stille aliaser på skallet spørsmål, og det er bra for testing, men det er mer fornuftig å sette aliasene i ~ /.bash_profile og ~ /.bashrc . Eller lage noe sånt ~ /.aliases og kaller det fra konfigurasjonsfiler som så:

 hvis [-f ~ /.bash_aliases]; da     . ~ /.bash_aliasesfi 

​​For å se aliasene som allerede er satt, bare kjøre alias på skallet. Du kan bli overrasket over hva som allerede er satt som standard på din distribusjon. Her er standardsettet jeg har på opensuse 11.2, uten å ha gjort noen endringer:

 alias + = 'pushd .'alias - =' popd'alias .. = 'cd ..' alias ... = ' cd ../..'alias pip = 'ekko -en " \\ 007 "' alias cd .. = 'cd ..' alias dir = 'ls -l'alias l =' ls -alF'alias la = ' ls -la'alias ll = 'ls -l'alias ls =' ls $ LS_OPTIONS'alias ls-l = 'ls -l'alias md =' mkdir -p'alias o = 'less'alias rd =' ​​rmdir ' alias rehash = 'hash -r'alias avmontere =' echo " Feil: Prøv kommandoen: umount " 1 > & 2; false'alias deg = 'hvis test " $ EUID " = 0; deretter /sbin /yast2 online_update; annet su - -c " /sbin /yast2 online_update "; fi '

Som en test, kan det være lurt å se hva som allerede er satt av din distro og prøve å gjøre opp noen av dine egne.

Shell Expansion

Før bash utfører en kommando, evaluerer det innspill og " utvider " aliaser og andre uttrykk når det passer. Du har allerede sett noen eksempler på utvidelse med aliaser og tilde (~) utvide til $ HOME

Bash også har noen få tegn det utvider, ofte referert til som ". Jokertegn, " at den vil ekspandere for å samsvare med en eller flere tegn. Denne typen mønstergjenkjenning kan være veldig nyttig. For eksempel, hvis du ønsker å se alle JPEG-bilder i en katalog, kjøre ls * jpg (er forutsatt at JPEG merket med jpg, selvfølgelig) og bash vil utvide det til å matche alle
filnavn som slutter med jpg .

Hvis du bare ønsker å matche et enkelt tegn, bruke? i stedet. Det vil matche et enkelt tegn - så " ls .jpg "? ville bare matche filnavn som " 1.jpg " eller " a.jpg " og ikke " 01.jpg " og så videre

Bash tillater. også du matche områder av tegn med braketter. Bruke [abc12] ville matche en av disse tegnene når utvidet. Så kjører " ls -IH [abc12] .jpg ville matche a.jpg, b.jpg, c.jpg, 1.jpg og 2.jpg, men ikke anbefale 12.jpg eller abc.jpg .

Du kan også negere mønster med prefikset med en " bang " Som så (!): [! AB12]. Ls -IH .jpg ville matche c.jpg eller 3.jpg, men ikke 2.jpg, og så videre

En annen hendig Trikset er spenne utvidelse. Jeg liker å organisere mine dokumenter etter år og dato. Det under mappen min ~ /Dokumenter Jeg har en 2010-katalogen med underkataloger 01 til 12. Jeg har ikke lyst til å skrive ut 01 til 12, så jeg gjør bash gjøre jobben i stedet:

 mkdir 2010 /{01 ..12} 

Når bash leser at det utvider
hva som er i de bukseseler til 01 til 12. Dette virker også med bokstaver, så hvis du ønsket en gjennom z underkataloger, du kan kjøre
< pre> mkdir {a..z}

og bash ville skape et gjennomspill z kataloger. Kan også arbeide med store bokstaver.

Dette fungerer også med kommaseparerte verdier. Si du har en katalog full av bildefiler i JPEG, PNG og GIF-format. Du ønsker å flytte dem inn i et bilde-katalogen. En måte ville være å skrive mv * .jpg * .png * .gif /bilder, og som fungerer OK. En annen, litt enklere måte, ville være å bruke mv *. {Jpg, gif, png} /bilder.

En annen nyttig utvidelse er kommando substitusjon. Dette kan være veldig nyttig hvis du ønsker å inkludere resultatene av en kommando i en annen kommando. Syntaksen er:

 kommandoen `anothercommand` 

Bash vil kjøre " anothercommand " og deretter utføre den første kommandoen på resultatene. Som et eksempel, hvis du ønsket å lage et filnavn basert på resultatet av dagens dato, kan du bruke denne:

 preg `date +% F`.txt 

Resultatet av " dato + % F " ville bli året, måneden, og deretter dato atskilt av " - " karakter. Så jeg ville få noe sånt som " 2010-01-14.txt " som en ny fil

Mer til Kom

For nå er det nok til å ta et skritt til ". neste nivå " ved hjelp av skallet. Det er mye mer å lære om å jobbe på skallet, men nå skal du ha litt mer komfort utforske og være i stand til å gjøre mer på skallet. Fremtidige tutorials vil dekke noen grunnleggende shell scripting og nyttige kommandoer for å kjøre på skallet.