Linux Printf Format Binære Alternativer


Printf-kommandoen Stranger, dette er et veldig stort emne som trenger erfaring - vær så snill å fylle ut manglende informasjon, utvide beskrivelsene og korrigere detaljene hvis du kan OBS! Dette handler om Bash-builtin-utskriftsfasen - men beskrivelsen skal være nesten identisk for en ekstern kommando som følger POSIX. GNU Awk forventer et komma etter formatstrengen og mellom hver av argumentene til en printf-kommando. For eksempler, se: kodebit. I motsetning til andre dokumentasjoner, vil jeg ikke omdirigere deg til den manuelle siden for printf () C-funksjonsfamilien. Men hvis du er mer erfaren, bør det være den mest detaljerte beskrivelsen for formatstrenger og modifikatorer. På grunn av motstridende historiske implementeringer av ekkokommandoen, anbefaler POSIX at printf er foretrukket over ekko. Printf-kommandoen gir en metode for å skrive ut forhåndsformatert tekst som ligner på printf () systemgrensesnittet (C-funksjon). It039s ment som etterfølger for ekko og har langt flere funksjoner og muligheter. Foruten andre grunner har POSIX et veldig godt argument for å anbefale det: Begge historiske hovedsmakene i ekkokommandoen er felles eksklusive, de kolliderer. En quotnewquot-kommando måtte oppfinnes for å løse problemet. Tekstformatet er gitt i ltFORMATgt. mens alle argumenter som formatstrengen kan peke på, blir gitt etter det, her angitt av ltARGUMENTSgt. Så ser en typisk printf-call ut: hvor cvNavn: snNavn: snquot er formatspesifikasjonen, og de to variablene sendes som argumenter, s i formatstrengen peker til (for hvert format spesifiserer du gir, printf venter på ett argument) . Hvis gitt, blir utgangen tildelt variabelen VAR i stedet for utskrift til stdout (sammenlignbar med sprintf () på en eller annen måte) - v-alternativet kan039t tilordne direkte til arrayindekser i Bash-versjoner eldre enn Bash 4.1. I versjoner som er nyere enn 4.1, må man være forsiktig når man utfører utvidelser i det første ikke-valgargumentet for printf, da dette åpner muligheten for en enkel kodeinsprøytningssårbarhet. hvor ekkoet selvfølgelig kan erstattes med enhver vilkårlig kommando. Hvis du må, angi enten en hardkodet formatstreng eller bruk - for å signalere slutten av alternativene. Nøyaktig samme problem gjelder også for lesing. og en lignende til kartfil. Selv om det utføres utvidelser i sine argumenter, er det mindre vanlig. Selvfølgelig i shell-betydningen argumenter er bare strenger, men de felles C-notasjonene pluss noen tillegg for tallkonstanter er anerkjent for å gi et tallargument for å skrive ut. Basalt er det et problem med bærbarhet (og pålitelighet). I utgangspunktet aksepterte ekko ikke noe alternativ og utvidet ikke noe. Alt det som var å gjøre, var å skille ut sine argumenter adskilt av et mellomromstegn og avsluttet av en nylinjetegn. Nå trodde noen at det ville vært fint om vi kunne gjøre ting som ekko nt for å skrive ut newline eller tabtegn, eller ha et alternativ om ikke å skrive ut den etterfølgende newline-karakteren. De trodde da vanskeligere, men i stedet for å legge til den funksjonaliteten til skallet (som perl hvor inne i dobbelte sitater, betyr det egentlig ikke en tabulator), de la den til ekko. David Korn realiserte feilen og introduserte en ny form for shell sitater:. som senere ble kopiert av bash og zsh, men det var langt for sent på den tiden. Nå når et standard Unix-ekko mottar et argument som inneholder de to tegnene og t. i stedet for å skrive ut dem, utsender det en tabulator. Og så snart det ser c i et argument, stopper det å skrive ut (slik at den etterfølgende nye linjen ikke blir lagt ut). Andre shellsUnix vendorsversions valgte å gjøre det annerledes: de la til et - e alternativ for å utvide rømmingssekvenser, og et - n alternativ for ikke å sende ut den etterfølgende nye linjen. Noen har en - E for å deaktivere fluktsekvenser, noen har - n men ikke - e. Listen over fluktssekvenser som støttes av en ekkoimplementering, er ikke nødvendigvis den samme som støttet av en annen. På disse ekko-implementeringene som støtter alternativer, er det generelt ingen støtte for a - for å markere slutten av alternativer (zsh og muligens andre støtter - for det selv), for eksempel, det er vanskelig å utføre - n med ekko i mange skjell. På enkelte skjell som bash 1 eller ksh93 2 eller yash (ECHOSTYLE-variabel), avhenger oppførselen av hvordan skallet ble sammensatt eller miljøet (GNU ekkos oppførsel vil også endres hvis POSIXLYCORRECT er i miljøet). Så to bash echo s, selv fra samme versjon av bash er ikke garantert å oppføre seg det samme. POSIX sier: Hvis det første argumentet er - n eller noe argument inneholder tilbakeslag, er oppførelsen uspesifisert. bash echo i den henseende er ikke POSIX i det for eksempel ekko - e er ikke outputting-helt nye som POSIX krever. Unix-spesifikasjonen er strengere, den forbyder - n og krever utvidelse av noen fluktsekvenser, inkludert c-en for å stoppe utmatingen. Disse spesifikasjonene kommer egentlig ikke til redning her, gitt at mange implementeringer ikke er kompatible. Alt i alt vet du ikke hva ekko var vil produsere med mindre du kan sørge for at var ikke inneholder tilbakestrekte tegn og begynner ikke med -. POSIX-spesifikasjonen sier faktisk at vi skal bruke printf i stedet. Så det betyr at du ikke kan bruke ekko til å vise ukontrollerte data. Med andre ord, hvis du skriver et skript og det tar ekstern inngang (fra brukeren som argumenter eller filnavn fra filsystemet.), Kan du ikke bruke ekko til å vise det. (Selv om det vil fungere OK med noen (ikke Unix) ekko-implementeringer som bash s når xpgecho-alternativet ikke er aktivert på en eller annen måte, som på kompileringstid eller via miljøet). printf. På den annen side er det mer pålitelig, i hvert fall når det er begrenset til grunnleggende bruk av ekko. Vil utdata innholdet av var etterfulgt av en nylinjetegn uavhengig av hvilken karakter det kan inneholde. Vil sende det ut uten den etterfølgende newline-karakteren. Nå er det også forskjeller mellom printf-implementeringer. Det er en kjerne av funksjoner som er spesifisert av POSIX, men da er det mange utvidelser. For eksempel, noen støtter en q for å sitere argumenter, men hvordan det er gjort varierer fra skall til skall, noen støtter uxxxx for unicode-tegn. Oppførselen varierer for printf 10sn var i multi-byte-lokaliteter, det er minst tre forskjellige utfall for printf b 123 Men til slutt, hvis du holder deg til POSIX-funksjonen sett med printf og ikke prøver å gjøre alt for fancy med det, er du ut av trøbbel. Men husk at det første argumentet er formatet, så det bør ikke inneholde variabelt kontrollerte data. Et mer pålitelig ekko kan implementeres ved bruk av printf. som: Subshell (som innebærer å gyte en ekstra prosess i de fleste skal implementeringer) kan unngås ved hjelp av lokale IFS med mange skall, eller ved å skrive det som: 1. hvordan bash s echo behavior kan endres. Med bash. På kjøretid er det to ting som styrer oppførselen eller ekkoet (ved siden av aktivere - ekko eller redefinere ekko som en funksjon eller alias): xpgecho bash-alternativet og om bash er i posix-modus. posisjonsmodus kan aktiveres hvis bash kalles sh eller hvis POSIXLYCORRECT er i miljøet eller med posix-alternativet: Standard oppførsel på de fleste systemer: xpgecho utvider sekvenser som Unix krever: Det er fortsatt ære - n og - e (og - E ): Med xpgecho og POSIX modus: Denne gangen er bash både POSIX og Unix conformant. Merk at i POSIX-modus er bash fortsatt ikke POSIX-konformitet, da den ikke output - e: Standardverdiene for xpgecho og posix kan defineres på kompileringstid med - enable-xpg-echo-default og - enable-strict - posix-standardalternativer til konfigureringsskriptet. Det er vanligvis hva nyere versjoner av OSX gjør for å bygge sin binsh. Ingen UnixLinux implementeringsdistribusjon i sitt rette sinn ville vanligvis gjøre det for binbash skjønt. 2. Hvordan ksh93 s ekko atferd kan endres. I ksh93. om ekko utvider fluktsekvenser eller ikke, og gjenkjenner alternativer avhenger av innholdet i PATH. Hvis PATH inneholder en komponent som inneholder 5bin eller xpg før bin eller usrbin-komponenten, oppfører den seg SysVUnix-måten (utvider sekvenser, godtar ikke alternativer). Hvis den finner ucb eller bsd først, oppfører den BSD 3-veis (-e for å aktivere utvidelse, gjenkjenner - n). Standard er systemavhengig, BSD på Debian: 3. BSD for echo - e Referansen til BSD for håndtering av - e-alternativet er misvisende her. Alle de forskjellige og inkompatible ekkoatferdene ble alle introdusert ved Bell Labs: n. 0ooo i Programmerer Arbeidsbenk UNIX (basert på Unix V6), og resten (f. Eks.) I Unix System III Ref. - en i Unix V7 (av Denis Ritchie Ref) - E i Unix V8 (av Denis Ritchie Ref) BSD-er bare stammer fra Unix V7. FreeBSD ekko støtter fortsatt ikke - e. selv om det støtter-som Unix V7 gjorde. En fordel, hvis du vil kalle det det, ville være at du ikke trenger å fortelle det som ekko for å tolke visse fluktssekvenser som n. Det vet å tolke dem og vil ikke kreve en - e å gjøre det. (NB: den siste n er nødvendig, ekko innebærer det, med mindre du gir alternativet - n) Merk den siste n i printf. På slutten av dagen er det et spørsmål om smak og krav hva du bruker: ekko eller printf. Én ulempe av printf er ytelse fordi det innebygde shell-ekkoet er mye raskere. Dette kommer inn i spill spesielt i Cygwin, hvor hver forekomst av en ny kommando forårsaker tunge Windows-overhead. Da jeg endret mitt ekko-tunge program fra å bruke binecho til skallene ekko, ble resultatet nesten fordoblet. Det er en trade off mellom bærbarhet og ytelse. Det er ikke en slam dunk å alltid bruke printf. besvart 3. okt 14 kl. 17.00 Linux og Unix printf-kommandoen FORMAT-strengen inneholder tre typer objekter: vanlige tegn. som kopieres ordentlig til utgangen. tolkte tegnsekvenser, som er rømt med et tilbakeslag (). konvertering spesifikasjoner, som definerer måten ARGUMENT s vil bli uttrykt som en del av produksjonen. Her er et raskt eksempel som bruker disse tre typer objekter: Denne kommandoen gir utdataene: Her er FORMAT vedlagt i to anførselstegn (). Det er en konverteringspesifikasjon: s. som tolker argumentet John som en streng og legger det inn i utgangen. Det er tre rømte tegnsekvenser: to forekomster av og en forekomst av n. Sekvensen oversettes som et bokstavelig dobbelttalat, det er rømt med et tilbakeslag, slik at printf vet å behandle det som en bokstavelig karakter, og ikke som slutten av FORMAT-strengen. n er sekvensen for en ny linje, og forteller printf å starte en ny linje og fortsette produksjonen derfra. Kraften til printf ligger i det faktum at for en gitt FORMAT-streng kan ARGUMENT s endres for å påvirke utgangen. Eksempelvis kan utgangen av kommandoen i eksemplet ovenfor bli endret bare ved å endre argumentet, John. Hvis brukt i et skript. Dette argumentet kan settes til en variabel. Kommandoen vil for eksempel sette inn verdien av miljøvariabelen LOGNAME. som er brukernavnet til den som kjørte kommandoen. Konverteringsspesifikasjoner Hver konverteringsspesifikasjon begynner med a og slutter med et konverterings tegn. Mellom og konverteringstegnet kan det være, i rekkefølge: Et minustegn. Dette forteller printf til venstre - juster konverteringen av argumentet. Et heltall som spesifiserer feltbreddeutskrift vil skrive ut en konvertering av ARGUMENT i et felt, minst antall tegn bredt. Om nødvendig vil den bli polstret til venstre (eller høyre, hvis venstrejustering kreves) for å gjøre opp feltbredden. En periode som skiller feltbredden fra presisjonen. Et heltall, presisjonen, som angir det maksimale antall tegn som skal skrives ut fra en streng, eller antall sifre etter desimaltegnet til en flytende punktverdien, eller minimumsantalet siffer for et heltall. Disse skiller mellom henholdsvis et kort og et helt tall, og er generelt kun nødvendig for dataprogrammering. Konverteringspersonene selv, som forteller printf, hva slags argument som kan forventes, er som følger: Vær oppmerksom på at printf krever antall konverteringsstrenger for å matche antall ARGUMENT s det kartlegger dem en til en, og forventer å finne nøyaktig ett ARGUMENT for hver konverteringsstreng. Det eneste unntaket er en konverteringsstreng som bruker en stjerne, slik at strengene krever to argumenter hver. Konverteringsstrenger tolkes alltid fra venstre til høyre. Følgende utskriftskommando: Produksjon av følgende utdata: Tolkede avvikte tegnsekvenser Følgende tegnsekvenser tolkes som spesialtegn ved printf: skriver ut et dobbeltkvote () skriver ut et tilbakeslag () utgjør et varsel (spiller en klokke) utskrifter en backspace instruerer printf for å produsere ingen ytterligere utskriftsutskrifter, et flyktegn (ASCII-kode 27) skriver ut en horisontal tavle, skriver en vertikal tabulator, skriver en byte med oktalverdi NNN (1 til 3 siffer), skriver ut en byte med heksadecinalverdi HH (1 til 2 siffer) skriver ut unicode-tegnet med heksadesimal verdi HHHH (4 siffer) skriver ut unicode-tegnet med heksadesimal verdi HHHHHHHH (8 siffer) skriver ut ARGUMENT som en streng med rømmer tolket som nevnt ovenfor, med unntak av at oktale rømminger tar skjemaet 0 eller 0 NN Quoting In The Shell Vær forsiktig med måten din skall tolker sitert strenger. Hvis skallet ditt ikke tolker den oppgitte strengen riktig, kan du prøve å bruke enkle anførselstegn i stedet for dobbelte anførselstegn. printf eksempler Skriver ut følgende utgang: Skriver ut samme utgang som eksemplet ovenfor. Skriver ut en streng som forteller deg plasseringen av hjemmekatalogen din. Beslektede kommandoer awk mdash Tolk for AWK tekstbehandling programmeringsspråk. bc mdash En kalkulator. ekko mdash Output-tekst.

Comments

Popular posts from this blog

Best Bevegelige Gjennomsnittet Til Bruk

Forex Trading In Kenya Online

Best Binære Options Megler Europa Band