Ukjent Bash Tips og triks for Linux

Kjennskap skaper ennui
, og selv om Bash er standard Linux kommandoskall brukes daglig av horder av fornøyde brukere, den inneholder et vell av interessante og nyttige funksjoner som don ' t får mye oppmerksomhet. I dag skal vi lære om Bash builtins og drepe potensial.

Bash builtins

Bash har en haug med innebygde kommandoer, og noen av dem er strippet ned versjoner av sine eksterne GNU coreutils søskenbarn . Så hvorfor bruke dem? Du har sannsynligvis allerede gjør, på grunn av rekkefølgen på kommando kjøres i Bash:


    Bash aliaser

    Bash søkeord

    Bash funksjoner

    Bash builtins

    Scripts og kjørbare programmer som er i din PATH

    Så når du kjører ekko, drepe, printf, pwd, eller test mest sannsynlig du bruker bash builtins stedet GNU coreutils kommandoer. Hvordan vet du? Ved å bruke en av de Bash builtins å fortelle deg, kommandoen kommando:


     $ kommando -V echoecho er et skall innebygd $ kommando -V Pingping er /bin /ping 


    De Bash builtins ikke har man-sidene, men de har en baklengs hjelpe innebygd kommando som viser syntaks og alternativer:


     $ hjelp echoecho: echo [-neE] [arg ...] Skriv argumenter til standard ut. Vise args til standard output etterfulgt av et linjeskift. Alternativer: -n ikke legge en ny linje -e aktiver tolkning av følgende backslash rømming [...] 


    Jeg kaller det bakover fordi de fleste Linux-kommandoer bruker en syntaks for kommando --help, der hjelp er en kommando alternativ i stedet for en kommando

    Den type kommando ser mye som kommandoen innebygd, men det gjør mer.


     $ typen -a catcat er /bin /cat $ typen -t catfile $ typen llll er aliaser til `ls -alF '$ typen -a echoecho er et skall builtinecho er /bin /echo $ typen -t grepalias 


    Den type verktøyet identifiserer builtin kommandoer, funksjoner, aliaser, søkeord (også kalt reserverte ord), og også binære kjør og skript, som det kaller file
    . På dette punktet, hvis du er som meg, er du brummende "Hva med å vise meg en liste over de darned ting." Jeg hører og adlyder, for du finner disse herlig dokumentert i GNU Bash Reference Manual indekser. Ikke vær redd, fordi i motsetning til de fleste programvare documention dette ikke er en skremmende mytisk skapning som Sasquatch, men en ekte live fullstendig kommando referanse.

    Poenget med denne lille øvelsen er slik at du vet hva du er virkelig hjelp når du skriver en kommando i Bash skallet, og slik at du vet hvordan det ser ut til Bash. Det er én mer overlapp Bash innebygd, og det er tiden stikkord:


     $ typen -t timekeyword 


    Så hvorfor skulle du ønske å bruke Bash builtins i stedet for deres GNU søskenbarn? Builtins kan utføre litt raskere enn de eksterne kommandoer, fordi eksterne kommandoer må punge en ekstra prosess. Jeg tviler på dette er mye av et problem på moderne datamaskiner fordi vi har hestekrefter å brenne, i motsetning til de gamle dager når alt vi hadde var bitte liten nanohertzes, men når du tilpasse ytelsen det er én ting å se på. Når du ønsker å bruke GNU kommandoen i stedet for Bash innebygd bruke sin helhet banen, som du kan finne kommandoen, type, eller den gode gamle ikke-Bash kommandoen som følger:


     $ som ekko /bin /echo $ som som /usr /bin /hvilke 
    Bash funksjoner

    Kjør erklærer -F for å se en liste over Bash sin builtin funksjonsnavn. erklære -f skriver ut de komplette funksjoner, og erklærer -f [funksjonsnavn] skriver den oppgitte funksjonen. typen vil ikke finne listefunksjonene, men når du vet et funksjonsnavn vil det også skrive det:

     $ typen quotequote er en functionquote () {echo \\ '$ {1 //\\' /\\ '\\ \\\\ '\\'} \\ '} 

    Dette fungerer selv for dine egne funksjoner som du oppretter, som dette enkelt eksempel testfunc som gjør én ting: endringer i /etc katalogen:

     $ funksjon testfunc> {> cd /etc>} 

    Nå kan du bruke olle og skriv for å liste opp og vise den nye funksjonen akkurat som builtins.

    Bash voldelige Side

    Ikke la deg lure av Bash er rolig, lydig utvendig, fordi det er i stand til å drepe. Det har vært mange endringer i hvordan Linux styrer prosesser, i noen tilfeller gjør dem vanskeligere å stoppe, så vet hvordan å drepe rømte prosesser er fortsatt en viktig bit av kunnskap. Heldigvis, til tross for alt dette nymotens "fremskritt" pålitelige gamle drapsmennene fortsatt arbeide

    Jeg har hatt noen problemer med bleeding-edge versjoner av KMail.; det henger og ønsker ikke å lukke på normal måte. Den gyter en enkelt prosess, som vi kan se med kommandoen ps:

     ps AXF | grep kmail 2489? Sl 01:44 /usr /bin /kmail -caption KMail 

    Du kan starte forsiktig og prøv dette:

     $ drepe 2 489 

    Dette sender standard SIGTERM (signal avslutte) signal, som er lik den SIGINT (signal interrupt) sendes fra tastaturet med Ctrl + c. Så hva hvis dette ikke fungerer? Deretter kan du piffe opp bremsekraft og bruke SIGKILL, som dette:

     $ kill -9 2489 

    Dette er den kjernefysiske alternativet, og det vil fungere. Som den relevante delen av GNU C manuelle sier: "The SIGKILL signal brukes til å føre til umiddelbar program oppsigelse Det kan ikke håndteres eller ignorert, og er derfor alltid dødelig Det er heller ikke mulig å blokkere dette signalet..." Dette er forskjellig fra SIGTERM og SIGINT og andre signaler som høflig ber prosesser for å avslutte. De kan være fanget og håndtert på ulike måter, og selv blokkert, slik at responsen du får en SIGTERM avhenger av hvordan programmet du prøver å drepe er programmert til å håndtere signaler. I en ideell verden til et program reagerer på SIGTERM ved rydding før du går ut, som etterbehandling disk skriver og slette midlertidige filer. SIGKILL banker det ut og ikke gi det en sjanse til å gjøre noen opprydding. (Se man 7 signal for en fullstendig beskrivelse av alle signaler.)


    Så hva er spesielt med Bash drepe i løpet av GNU /bin /drepe? Min favoritt er hvordan det ser ut når du starter hjelpen oppsummering:

     $ hjelp kill 

    En annen fordel er at det kan bruke jobbkontrollnummer i tillegg til PID'er. I denne moderne æra av tabbed terminalemulatorer jobbkontroll er ikke så farlig det pleide å være, men muligheten er der hvis du ønsker det. Den største fordelen er at du kan drepe prosesser, selv om de har gått berserk og maxed ut systemets prosess nummer grense, noe som vil hindre deg fra å lansere /bin /kill. Ja, det er en grense, og du kan se hva det er ved å spørre /proc:

     $ cat /proc /sys /kernel /tråder-max61985 

    Med Bash drepe det finnes flere måter å angi hvilke signalisere at du ønsker å bruke. Disse er alle det samme.

     $ drepe 2489 $ drepe -s TERM 2489 $ drepe -s SIGTERM 2489 $ drepe -n 15 2489 

    drepe -l lister alle støttede signaler

    Hvis du bruker litt kvalitetstid med mannen bash og GNU Bash Manual Jeg daresay du vil lære mer verdifulle oppgaver som Bash kan gjøre for deg.