Hvordan bli en kommandolinjeveiviser

Den mest nyttige informatikkklassen du sannsynligvis aldri har tatt

Bilde generert med Stabil diffusjon

One ting jeg konsekvent har observert gjennom karrieren min er at de mest produktive dataviterne og ingeniørene vanligvis har én ting til felles: de er kommandolinjeveivisere. De kan navigere i datamaskinens filsystem, søke etter mønstre i loggfiler og administrere jobber, kildekode og versjonskontroll alt fra kommandolinjen, uten å stole på treg navigering med musen og grafiske brukergrensesnitt.

Likevel er denne kommandolinje "trolldom", som den kan virke for noen som ikke er kjent med skallverktøy, vanligvis ikke en del av standard læreplaner for informatikk. An MIT kurs rundt mestring av kommandolinjen heter det passende "Det manglende semesteret av CS-utdanningen din".

Dette innlegget er min personlige 10-leksjons 'command-line wizardry 101'-klasse, rettet mot lesere som ønsker å jobbe mer med kommandolinjen og mindre med grafiske brukergrensesnitt. Vi vil dekke grunnleggende rundt skallet og banevariabelen, aliaser, filtillatelser, streaming og rørføring, effektiv jobbadministrasjon, tmux, ssh, git og vim.

La oss komme i gang. Velkommen til CLW 101.

1. Skallet

Når du åpner terminalen, ser du på en shell, for eksempel bash (borne again shell) eller ZSH (z-shell). Skallet er virkelig et komplett programmeringsspråk med tilgang til visse standardprogrammer som tillater filsystemnavigering og datamanipulering. Du kan finne ut hvilket skall du kjører ved å skrive:

ekko $ SHELL

I bash, hver gang du starter et nytt skall, laster skallet en sekvens av kommandoer som er spesifisert i .bashrc fil, som vanligvis er i hjemmekatalogen din (hvis du bruker en Mac, er det vanligvis en .bash_profile fil i stedet). I den filen kan du spesifisere nyttige ting som din banevariabel eller aliaser (mer om hvilke nedenfor).

2. Stivariabelen

Når du skriver inn navnet på visse programmer i skallet ditt, for eksempel python, cateller ls, hvordan vet skallet hvor det programmet skal hentes fra? Det er hensikten med banevariabel. Denne variabelen lagrer en liste over alle stier der skallet ser etter programmer, atskilt med kolon. Du kan inspisere banevariabelen ved å skrive:

ekko $ PATH

Og du kan legge til flere kataloger til banevariabelen din med denne kommandoen:

eksport PATH="my_new_path:$PATH"

Det er best å legge til denne kommandoen i bashrc-filen din, slik at den ekstra katalogen din alltid er i veien når du starter et nytt skall.

3. Aliaser

Aliaser er egendefinerte kommandoer som du kan definere for å unngå å skrive lange kommandoer om og om igjen, for eksempel:

alias ll="ls -lah"
alias gs="git status"
alias gp="git push origin master"

Aliaser kan også brukes til å skape sikkerhetstiltak for utviklingsarbeidsflyten din. For eksempel ved å definere

alias mv="mv -i"

terminalen din vil advare deg hvis filen du skal flytte allerede eksisterer under den nye katalogen, slik at du ikke ved et uhell overskriver filer som du ikke mente å overskrive.

Når du legger til disse aliasene i bashrc-filen din, er de alltid tilgjengelige når du starter et nytt skall.

4. Filtillatelser og sudo

Når flere brukere deler en maskin, er det viktig å stille inn filtillatelser som bestemmer hvilken bruker som kan utføre hvilke operasjoner på hvilke data. Når du skriver ls -l, vil du se filene i din nåværende katalog sammen med deres tillatelser i følgende skjema:

-rwxrwxrwx

Her

  • rwx står for henholdsvis lese-, skrive- og utførelsesrettigheter
  • den 3 rwx blokker er for (1) bruker, (2) brukergruppe og (3) alle andre. I det gitte eksemplet har alle 3 av disse enhetene lese-, skrive- og kjøretillatelser.
  • bindestreken indikerer at dette er en fil. I stedet for bindestreken kan du også se en d for katalog eller l for en symbolsk lenke.

Du kan redigere filtillatelser med chmod. For eksempel, hvis du vil gjøre en fil kjørbar for deg selv, skriver du

chmod u+x my_program.py

👉 Hvis en fil er kjørbar, hvordan vet skallet hvordan den skal kjøres? Dette er spesifisert med en 'hashbang' i den første raden i filen, som f.eks #!/bin/bash for et bash-manus eller #!/bin/python for et python-skript.

Til slutt er det en spesiell "superbruker" som har alle tillatelsene for alle filene. Du kan kjøre hvilken som helst kommando mens den superbrukeren skriver sudo foran den kommandoen. Du kan også starte et frittstående sudo-skall ved å kjøre

sudo su

⚠️ Bruk sudo med forsiktighet. Med sudo kan du gjøre endringer i koden som styrer datamaskinens maskinvare, og en feil kan gjøre maskinen ubrukelig. Husk, med stor makt følger stort ansvar.

5. Streaming og rørføring

De streaming operatør > omdirigerer utdata fra et program til en fil. >> gjør det samme, men den legger til en eksisterende fil i stedet for å overskrive den, hvis den allerede eksisterer. Dette er nyttig for å logge dine egne programmer som dette:

python my_program.py > loggfil

Et annet nyttig konsept er piping: x | y kjører program x, og sender utdataene fra x til program y. For eksempel:

  • cat log.txt | tail -n5 : skriver ut de siste 5 linjene fra log.txt
  • cat log.txt | head -n5 : skriver ut de første 5 linjene fra log.txt
  • cat -b log.txt | grep error : viser alle linjer i log.txt som inneholder strengen 'feil', sammen med linjenummeret (-b)

6. Administrere jobber

Hvis du kjører et program fra kommandolinjen (f python run.py), vil programmet som standard kjøre i forgrunnen, og hindre deg i å gjøre noe annet før programmet er ferdig. Mens programmet kjører i forgrunnen, kan du:

  • type kontroll+C, som vil sende et SIGINT (signalavbrudd) signal til programmet, som instruerer maskinen om å avbryte programmet umiddelbart (med mindre programmet har en måte å håndtere disse signalene internt).
  • skriv kontroll+Z, som vil sette programmet på pause. Etter pause kan programmet fortsette enten ved å bringe det i forgrunnen (fg), eller ved å sende den til bakgrunnen (bg).

For å starte kommandoen i bakgrunnen med en gang, bruker du & operatør:

python run.py &

👉 Hvordan vet du hvilke programmer som kjører i bakgrunnen for øyeblikket? Bruk kommandoen jobs. Dette vil vise navnene på jobbene som kjører, samt deres prosess-IDer (PID).

Til slutt,kill er et program for å sende signaler til programmer som kjører i bakgrunnen. For eksempel,

  • kill -STOP %1 sender et STOPP-signal og setter program 1 på pause.
  • kill -KILL %1 sender et KILL-signal og avslutter program 1 permanent.
Fire terminalruter på min personlige Macbooks terminal med tmux (bilde av forfatteren).

7. tmux

tmux ('terminal multiplexer') lar deg enkelt opprette nye terminaler og navigere mellom dem. Dette kan være svært nyttig, for eksempel kan du bruke en terminal til å navigere i filsystemet og en annen terminal til å utføre jobber. Med tmux kan du til og med ha begge disse side om side.

👉 En annen grunn til å lære tmux er ekstern utvikling: når du logger ut av en ekstern maskin (enten med vilje eller ved et uhell), blir alle programmene som aktivt kjørte inne i skallet ditt, automatisk avsluttet. På den annen side, hvis du kjører programmene dine i et tmux-skall, kan du ganske enkelt koble fra tmux-vinduet, logge ut, lukke datamaskinen og komme tilbake til det skallet senere som om du aldri har vært logget ut.

Her er noen grunnleggende kommandoer for å komme i gang med tmux:

  • tmux new -s run oppretter ny terminaløkt med navnet 'run'
  • control-BD: løsne dette vinduet
  • tmux a : fester til siste vindu
  • tmux a -t run : fest til vindu kalt 'kjør'
  • control-B“ : legg til en annen terminalrute nedenfor
  • kontroll-B% : legg til en annen terminalrute til høyre
  • control-B➡️ : flytt til terminalruten til høyre (liknende for venstre, opp, ned)

8. SSH og nøkkelpar

ssh er et program for å logge på eksterne maskiner. For å logge på eksterne maskiner, må du enten oppgi brukernavn og passord, eller du bruker et nøkkelpar som består av en offentlig nøkkel (som begge maskinene har tilgang til) og en privat nøkkel (som kun din egen maskin) har tilgang til).

ssh-keygen er et program for å generere et slikt nøkkelpar. Hvis du løper ssh-keygen, vil den som standard opprette en offentlig nøkkel kalt id_rsa.pub og en privat nøkkel kalt id_rsa, og plasser begge i din ~/.ssh katalog. Du må legge til den offentlige nøkkelen til den eksterne maskinen, som du, som du burde vite nå, kan gjøre ved å koble sammen cat, ssh, og en strømmeoperatør:

cat .ssh/id_rsa.pub | ssh user@remote 'cat >> ~/.ssh/authorized_keys'

Nå vil du kunne bruke ssh til fjernkontrollen bare ved å oppgi din private nøkkel:

ssh fjernkontroll -i ~/.ssh/id_rsa

En enda bedre praksis er å lage en fil ~/.ssh/config som inneholder alle ssh-autentiseringskonfigurasjonene dine. For eksempel hvis din config filen er som følger:

Host dev
HostName fjernkontroll
IdentityFile ~/.ssh/id_rsa

Deretter kan du logge på fjernkontrollen ved å skrive ssh dev.

9. git

git er et versjonskontrollsystem som lar deg effektivt navigere i kodens versjonshistorikk og grener fra kommandolinjen.

👉 Merk det git er ikke det samme som GitHub: git er et frittstående program som kan administrere kodens versjonering på din lokale bærbare datamaskin, mens GitHub er et sted å hoste koden din eksternt.

Her er noen viktige git-kommandoer:

  • git add : spesifiserer hvilke filer du vil inkludere i neste commit
  • git commit -m 'my commit message' : begår kodeendringen
  • git checkout -b dev : oppretter en ny gren kalt 'dev' og sjekk ut den grenen
  • git merge dev : slår sammen dev til gjeldende gren. Hvis dette skaper flettekonflikter, må du fikse disse konfliktene manuelt og deretter kjøre git add file_that_changed; git merge --continue
  • git stash : tilbakestiller alle endringer, og git stash pop bringer dem tilbake. Dette er nyttig hvis du har gjort endringer i hovedgrenen, og deretter bestemmer deg for at du faktisk vil at disse endringene skal være en separat gren.
  • git reset --hard : tilbakestiller alle endringer permanent

Og her er noen viktige git-kommandoer for å håndtere en ekstern vert (f.eks GitHub):

  • git clone : kloner en kopi av koden repo til din lokale maskin
  • git push origin master : sender endringene til den eksterne verten (f.eks. GitHub)
  • git pull : henter den nyeste versjonen fra fjernkontrollen. (Dette er det samme som å løpe git fetch; git merge;).

👉 Før du kan kjøre en kommando som f.eks git push origin master, må du autentisere med et ssh-nøkkelpar (se leksjon 8). Hvis du bruker GitHub, kan du ganske enkelt lime inn den offentlige nøkkelen under profilinnstillingene dine.

10. vim

Vim er en kraftig kommandolinjebasert tekstredigerer. Det er en god idé å lære i det minste de helt grunnleggende kommandoene i vim:

  • av og til må du kanskje logge på en ekstern maskin og gjøre en kodeendring der. vim er et standardprogram og derfor vanligvis tilgjengelig på alle maskiner du jobber med.
  • når du løper git commit, som standard åpner git vim for å skrive en commit-melding. Så i det minste vil du vite hvordan du skriver, lagrer og lukker en fil.

Det viktigste å forstå om vim er at det er forskjellige driftsmoduser. Når du starter vim, er du inne navigasjonsmodus, som du bruker til å navigere gjennom filen. Type i å starte redigeringsmodus, der du kan gjøre endringer i filen. Skriv inn Esc tasten for å gå ut av redigeringsmodus og gå tilbake til navigasjonsmodus.

Det nyttige med navigasjonsmodus er at du raskt kan navigere og manipulere filen med tastaturet, for eksempel:

  • x sletter et tegn
  • dd sletter en hel rad
  • b (tilbake) går til forrige ord, n (neste) går til neste ord
  • :wq lagrer endringene og lukker filen
  • :q! ignorerer endringene dine og lukker filen

For flere (mye mer!) vim-tastatursnarveier, sjekk ut dette vim juksearket.

Photo by Vasily Koloda on Unsplash

Avsluttende tanker

Gratulerer, du har fullført 'command line wizardry 101'. Vi har imidlertid bare skrapet i overflaten her. For inspirasjon, vurder følgende problem:

"Gitt en tekstfil og et heltall k, skriv ut kde vanligste ordene i filen (og antallet forekomster av dem) i synkende frekvens."

Som dataforsker kan min første impuls være å starte en Jupyter-notisbok, laste inn dataene kanskje i pandaer, og deretter bruke en funksjon som pandaer agg. Men til en erfaren kommandolinjeveiviser, dette er en one-liner:

tr -cs A-Za-z '' | tr AZ az | sortere | uniq -c | sorter -rn | sed ${1}q

Dette ser ikke så forskjellig ut fra Stable Diffusions fantasi vist i begynnelsen av denne artikkelen. Trolldom, faktisk.

Hvordan bli en kommandolinjeveiviser Republisert fra kilde https://towardsdatascience.com/how-to-become-a-command-line-wizard-5d78d75fbf0c?source=rss—-7f60cf5620c9—4 via https://towardsdatascience. no/feed

<!–

->

Tidstempel:

Mer fra Blockchain-konsulenter