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.