På denne siden

Skallet er mer enn et sted å skrive kommandoer — det er et lite programmeringsmiljø. Dette kapittelet dekker funksjonene som gjør hverdagsarbeid produktivt.

Få hjelp — man og –help

Ingen husker alle flagg. Hver kommando leveres med dokumentasjon du kan lese fra terminalen.

man <cmd> åpner manualsiden for en kommando:

$ man ls

Inne på mansiden: trykk / og skriv for å søke, n for neste treff, og q for å avslutte. Bruk Space for å bla en side om gangen.

For et raskt sammendrag i stedet for hele manualen aksepterer de fleste kommandoer --help (eller -h):

$ ls --help
$ tar --help

Ikke alle kommandoer har en manside eller --help (shell-innbygde kommandoer har ofte ikke det), men de fleste har det. Hvis du er usikker på hva en kommando gjør, søker apropos <nøkkelord> i mansidene etter et emne:

$ apropos compress

For å finne hvor en kommando ligger — nyttig når command not found forvirrer deg — bruk which:

$ which ls
/usr/bin/ls

Hvis which ikke skriver ut noe, er kommandoen enten ikke installert eller en shell-innbygd kommando. type forteller deg hvilken av delene det er:

$ type cd
cd is a shell builtin
$ type ls
ls is /usr/bin/ls

Pipes — koble kommandoer sammen

En pipe (|) sender utdataen fra én kommando som inndata til den neste.

$ ls | wc -l
14

Dette kan kjedes uendelig:

$ ps aux | grep sshd | head -5

Pipes er hjertet i Unix-filosofien: små verktøy som gjør én ting, kombinert etter behov.

Redireksjon — send utdata til filer

> skriver en kommandos utdata til en fil, og overskriver den:

$ echo "content" > file.txt
$ cat file.txt
content

>> legger til i stedet for å overskrive:

$ echo "more" >> file.txt
$ cat file.txt
content
more

2> omdirigerer feilutdata, som ellers er adskilt fra vanlig utdata:

$ ls nonexistent 2> errors.txt
$ cat errors.txt
ls: cannot access 'nonexistent': No such file or directory

For å forkaste utdata helt, send den til /dev/null:

$ command > /dev/null

For å skrive til en fil og samtidig se utdataen på skjermen, bruk tee:

$ echo "hello" | tee log.txt
hello
$ cat log.txt
hello

Globber — jokertegn

Skallet utvider *, ? og [] før det kjører en kommando. * matcher hvilket som helst antall tegn:

$ echo *.txt
f1.txt f2.txt f3.txt

? matcher nøyaktig ett tegn:

$ echo f?.txt
f1.txt f2.txt

Krøllparentes-utvidelse {a,b} genererer en liste:

$ echo {a,b,c}.txt
a.txt b.txt c.txt

Globber virker overalt hvor en sti forventes:

$ rm *.log
$ cp *.txt backup/

Miljøvariabler

Variabler lagrer verdier som skallet og programmer kan lese. $VAR utvides til verdien.

$ echo $HOME
/home/user
$ echo $USER
user

Sett din egen (varer bare for denne shell-sesjonen):

$ MYVAR=hello
$ echo $MYVAR
hello

export gjør en variabel tilgjengelig for programmer du starter:

$ export MYVAR

Vanlige innebygde variabler: $HOME (hjemmemappen), $USER (brukernavnet), $PATH (der skallet leter etter kommandoer), $SHELL (gjeldende shell).

history — kommandohistorikken din

Skallet husker alt du skriver. Trykk Pil opp for å bla bakover gjennom den, eller bruk history:

$ history
 1234  ls -la
 1235  cd Documents

Søk i historikken interaktivt: trykk Ctrl+R og begynn å skrive.

alias — snarveier for kommandoer

alias oppretter et kort navn for en lengre kommando.

$ alias ll="ls -l"
$ ll
total 4
-rw-r--r-- 1 user user 13 Aug  5 10:00 file.txt

List eksisterende aliaser:

$ alias
alias ll='ls -l'

Aliaser varer bare i den gjeldende sesjonen. For å beholde dem, legg linjen i ~/.bashrc — og åpne en ny terminal (eller kjør source ~/.bashrc).

Kjør i bakgrunnen

Å legge til & på slutten av en kommando kjører den i bakgrunnen — terminalen gir promptet tilbake med en gang, og du kan fortsette å skrive mens den jobber:

$ sleep 30 &
[1] 1234

jobs viser bakgrunnsjobbene i det gjeldende skallet:

$ jobs
[1]+  Running                    sleep 30 &

fg henter en jobb tilbake til forgrunnen, bg gjenopptar en satt på pause. (En jobb satt på pause med Ctrl+Z kan gjenopptas i bakgrunnen med bg.)

Hvis du vil at en langvarig jobb skal overleve at du logger ut, bruk nohup:

$ nohup ./backup.sh &

nohup ignorerer hangup-signalet som sendes når en sesjon avsluttes, og skriver utdata til nohup.out i stedet for terminalen. Kombinert med tmux (under) er dette den klassiske måten å la arbeid kjøre videre på en ekstern server.

tmux — terminalmultiplekser

tmux kjører flere terminalsesjoner inni ett vindu og lar deg koble fra og tilbake til dem. Kjernefunksjonen: en sesjon fortsetter å kjøre etter at du kobler fra, så du kan koble ut via SSH og plukke opp nøyaktig der du slapp.

Installer det hvis det mangler:

$ sudo apt install tmux        # Ubuntu
$ sudo dnf install tmux        # Fedora
$ sudo pacman -S tmux          # Arch

Start en sesjon:

$ tmux new -s mysession

Alt inni tmux bruker prefikstasten Ctrl+B, etterfulgt av en annen tast (de to første radene er shell-kommandoer, skrevet utenfor tmux som enhver annen kommando):

Taster Handling
Ctrl+B d detach (sesjonen fortsetter å kjøre)
tmux attach -t mysession koble til igjen
tmux ls list kjørende sesjoner
Ctrl+B c nytt vindu
Ctrl+B n / Ctrl+B p neste / forrige vindu
Ctrl+B % del ruten vertikalt
Ctrl+B " del ruten horisontalt
Ctrl+B x lukk gjeldende rute

Arbeidsflyten over SSH: start en sesjon, gjør langt arbeid, Ctrl+B d for å koble fra, koble ned — og senere tmux attach for å fortsette som om du aldri dro.

Vil du ha hele bildet — ruter, zoom, scrollback og en konfig på to linjer — går guiden tmux — sesjonen som overlever dypere inn.