{"id":1539,"date":"2026-06-09T09:27:58","date_gmt":"2026-06-09T07:27:58","guid":{"rendered":"https:\/\/vittrup-graversen.dk\/index.php\/terminal-tricks\/"},"modified":"2026-06-09T09:39:05","modified_gmt":"2026-06-09T07:39:05","slug":"terminal-tricks","status":"publish","type":"page","link":"https:\/\/vittrup-graversen.dk\/index.php\/terminal-tricks\/","title":{"rendered":"Terminal tricks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Kilde:<\/strong> Denne side er en dansk, praktisk opsummering. Pointen er enkel: terminalen er ikke bare et sted, hvor man skriver kommandoer. Det er et arbejdsmilj\u00f8. Jo bedre du former det, jo mindre friktion f\u00e5r du i hverdagen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Genbrug den sidste kommando i stedet for at skrive den igen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis en kommando fejler, fordi du glemte <code>sudo<\/code>, skal du ikke trykke pil-op, flytte cursoren og rette manuelt. Brug:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo !!<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>!!<\/code> udvider til hele den forrige kommando. Det er is\u00e6r nyttigt ved lange kommandoer med mange argumenter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et andet lille trick er <code>!$<\/code>, som betyder \u201csidste argument fra forrige kommando\u201d:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir my-project\ncd !$<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Her opretter du mappen og hopper direkte ind i den uden at skrive navnet to gange.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Brug Ctrl+R som s\u00f8gemaskine i din historik<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pil-op er den langsomme m\u00e5de at finde gamle kommandoer p\u00e5. <code>Ctrl+R<\/code> laver reverse search i din shell-historik. Skriv en del af kommandoen, for eksempel <code>docker<\/code>, og terminalen finder seneste match.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(reverse-i-search)`docker': docker-compose up -d --build<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Ctrl+R<\/code> igen: find \u00e6ldre matches<\/li>\n\n\n\n<li><code>Enter<\/code>: k\u00f8r kommandoen<\/li>\n\n\n\n<li><code>Esc<\/code>: rediger kommandoen f\u00f8r den k\u00f8res<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">G\u00f8r historikken st\u00f8rre ( <code>~\/.bashrc<\/code> eller <code>~\/.zshrc<\/code>), ellers s\u00f8ger du kun i et for lille vindue:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HISTSIZE=10000\nHISTFILESIZE=20000\nHISTCONTROL=ignoredups:erasedups<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Ret stavefejl med ^old^new<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis du lige har k\u00f8rt en kommando med en tastefejl, kan du rette og k\u00f8re den igen i \u00e9t hug( ^old^new substitution):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git chekcout main\n\n^chekcout^checkout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Shellen erstatter <code>chekcout<\/code> med <code>checkout<\/code> i den forrige kommando og k\u00f8rer den straks. Det er sm\u00e5ting, men sm\u00e5ting i terminalen gentages mange gange om dagen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Brug aliases til alt, du skriver igen og igen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis du skriver den samme kommando flere gange om ugen, b\u00f8r den have et alias. L\u00e6g dem i <code>~\/.bashrc<\/code> eller <code>~\/.zshrc<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Navigation\nalias ..='cd ..'\nalias ...='cd ..\/..'\nalias ~='cd ~'\nalias -- -='cd -'\n\n# Listing\nalias ll='ls -alF'\nalias lt='ls -ltr'\n\n# Sikkerhedsnet\nalias rm='rm -i'\nalias cp='cp -i'\nalias mv='mv -i'\n\n# Git\nalias gs='git status'\nalias ga='git add .'\nalias gc='git commit -m'\nalias gp='git push'\nalias gl='git log --oneline --graph --decorate'\nalias gco='git checkout'\n\n# Docker\nalias dps='docker ps'\nalias dc='docker-compose'\nalias dcu='docker-compose up -d'\nalias dcd='docker-compose down'\n\n# Node\nalias ni='npm install'\nalias nrd='npm run dev'\nalias nrb='npm run build'\n\n# Genindl\u00e6s shell-config\nalias reload='source ~\/.bashrc'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Den undervurderede er <code>alias -- -='cd -'<\/code>. Den fungerer som en browser-tilbageknap mellem to mapper.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. L\u00e6r tastaturgenvejene, der g\u00f8r lange kommandoer mindre irriterende<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Ctrl+A<\/code>: hop til starten af linjen<\/li>\n\n\n\n<li><code>Ctrl+E<\/code>: hop til slutningen af linjen<\/li>\n\n\n\n<li><code>Ctrl+W<\/code>: slet \u00e9t ord bagud<\/li>\n\n\n\n<li><code>Ctrl+U<\/code>: slet alt f\u00f8r cursoren<\/li>\n\n\n\n<li><code>Ctrl+K<\/code>: slet alt efter cursoren<\/li>\n\n\n\n<li><code>Ctrl+L<\/code>: ryd sk\u00e6rmen, samme som <code>clear<\/code><\/li>\n\n\n\n<li><code>Ctrl+C<\/code>: stop den aktuelle kommando<\/li>\n\n\n\n<li><code>Ctrl+Z<\/code>: suspend\u00e9r en proces, hent den tilbage med <code>fg<\/code><\/li>\n\n\n\n<li><code>Alt+F<\/code>: hop \u00e9t ord frem<\/li>\n\n\n\n<li><code>Alt+B<\/code>: hop \u00e9t ord tilbage<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Den praktiske kombination er ofte <code>Ctrl+A<\/code> og derefter <code>Ctrl+K<\/code>, hvis du vil slette hele kommandoen og starte forfra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Brug tmux, s\u00e5 dit arbejde overlever SSH-tab<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tmux<\/code> er is\u00e6r vigtigt p\u00e5 remote servere. Uden tmux kan en afbrudt SSH-forbindelse sl\u00e5 din k\u00f8rende proces ihjel. Med tmux forts\u00e6tter sessionen, og du kan koble dig p\u00e5 igen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Start en navngivet session\ntmux new -s myproject\n\n# Frakobl sessionen uden at stoppe arbejdet\nCtrl+B, derefter D\n\n# Kobl p\u00e5 igen senere\ntmux attach -t myproject\n\n# Vis sessioner\ntmux ls<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inde i tmux kan du splitte terminalen i paneler:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ctrl+B, derefter %      # split lodret\nCtrl+B, derefter \"      # split vandret\nCtrl+B, derefter pil    # skift panel<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Typisk setup: server i \u00e9t panel, logs i et andet og editor eller shell i et tredje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. K\u00f8r lange processer i baggrunden<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis du starter en build, test-suite eller lokal server, kan du sende den i baggrunden med <code>&amp;<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run build &amp;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>jobs<\/code>: se baggrundsjob<\/li>\n\n\n\n<li><code>fg<\/code>: hent jobbet tilbage i forgrunden<\/li>\n\n\n\n<li><code>Ctrl+Z<\/code> efterfulgt af <code>bg<\/code>: suspend\u00e9r en allerede k\u00f8rende proces og forts\u00e6t den i baggrunden<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Ctrl+Z\nbg<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8. Lav cd + ls til \u00e9n funktion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mange skriver <code>cd mappe<\/code> og derefter <code>ls<\/code>. Lav en lille shell-funktion i stedet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function cl() {\n  cd \"$1\" &amp;&amp; ls -la\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nu kan du skrive:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cl my-project<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aliases er gode til simple forkortelser. Funktioner er bedre, n\u00e5r du skal bruge argumenter eller lidt logik.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Installer fzf og g\u00f8r lister s\u00f8gbare<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>fzf<\/code> er en fuzzy finder til terminalen. Den kan s\u00f8ge i filer, kommandohistorik, git-branches, processer og alt andet, der kan sendes som en liste.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># macOS\nbrew install fzf\n\n# Ubuntu \/ Debian\nsudo apt install fzf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eksempler:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Find og \u00e5bn en fil\nvim $(fzf)\n\n# Skift git-branch interaktivt\ngit checkout $(git branch | fzf)\n\n# Find og stop en proces\nkill $(ps aux | fzf | awk '{print $2}')<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Branch-eksemplet er det, mange f\u00e5r mest ud af i praksis. Du beh\u00f8ver ikke huske hele branchnavnet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Kopi\u00e9r output direkte til clipboard<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stop med at markere tekst med musen, n\u00e5r du skal kopiere terminal-output. Pipe det direkte til clipboard.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># macOS\ncat some-file.txt | pbcopy\n\n# Linux\ncat some-file.txt | xclip -selection clipboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Det er is\u00e6r nyttigt til SSH-n\u00f8gler, tokens, logudsnit og lange kommando-output.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># macOS: kopi\u00e9r public SSH key\ncat ~\/.ssh\/id_rsa.pub | pbcopy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">P\u00e5 Linux kan <code>xclip<\/code> eller <code>xsel<\/code> bruges afh\u00e6ngigt af desktop-milj\u00f8et. P\u00e5 Wayland vil <code>wl-copy<\/code> ofte v\u00e6re det rigtige valg.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Brug thefuck til at rette forkerte kommandoer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/nvbn\/thefuck\" target=\"_blank\" rel=\"noopener\">thefuck<\/a> er et v\u00e6rkt\u00f8j, der analyserer den forrige kommando og foresl\u00e5r en rettelse.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install thefuck\nfuck<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Navnet er fjollet. Funktionen er reel. Det kan spare tid, n\u00e5r fejlen er en banal tastefejl, manglende flag eller en kendt kommando-variant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Min korte anbefaling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis du ikke bruger noget af det her i dag, s\u00e5 start ikke med alt. Start med tre ting:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>Ctrl+R<\/code> og st\u00f8rre shell-historik.<\/li>\n\n\n\n<li>Et lille s\u00e6t aliases til git, docker og navigation.<\/li>\n\n\n\n<li><code>fzf<\/code>, hvis du ofte arbejder med mange filer, branches eller processer.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Hvis du arbejder p\u00e5 servere via SSH, s\u00e5 kommer <code>tmux<\/code> f\u00f8r alt andet. Det er ikke pynt. Det er forskellen p\u00e5 et robust arbejdsmilj\u00f8 og en terminalsession, der d\u00f8r, n\u00e5r forbindelsen hoster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se ogs\u00e5 <a href=\"https:\/\/vittrup-graversen.dk\/index.php\/claude-code-cheat-sheet\/\">Claude Code Cheat Sheet<\/a> og <a href=\"https:\/\/vittrup-graversen.dk\/index.php\/top-50-claude-skills-github-repos-den-ultimative-samling\/\">Top 50+ Claude Skills &amp; GitHub Repos<\/a> under Coding-menuen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kilder<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/medium.com\/@TusharKanjariya\/i-used-the-terminal-wrong-for-years-5557b10c0b85\" target=\"_blank\" rel=\"noopener\">I Used the Terminal Wrong for Years<\/a> &#8211; Tushar Kanjariya, Medium, 19. marts 2026<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/junegunn\/fzf\" target=\"_blank\" rel=\"noopener\">fzf<\/a> &#8211; fuzzy finder til kommandolinjen<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/tmux\/tmux\/wiki\" target=\"_blank\" rel=\"noopener\">tmux wiki<\/a> &#8211; terminal multiplexer og sessioner<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/nvbn\/thefuck\" target=\"_blank\" rel=\"noopener\">thefuck<\/a> &#8211; command correction utility<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>En dansk, praktisk opsummering af terminal-tricks, der sparer tid: historik, aliases, tmux, fzf, clipboard og processer.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1539","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/pages\/1539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/comments?post=1539"}],"version-history":[{"count":2,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/pages\/1539\/revisions"}],"predecessor-version":[{"id":1543,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/pages\/1539\/revisions\/1543"}],"wp:attachment":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/media?parent=1539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}