Brug af bindestreg (-) i stedet for et filnavn

For en kommando, hvis du bruger - som argument i stedet for et filnavn betyder STDIN eller STDOUT.

  1. Men i dette eksempel opretter det en fil med navnet -:

    echo hello > - 

    Hvordan kan jeg få - til at betyde STDOUT i dette eksempel?

  2. Omvendt, hvordan kan jeg få - til at betyde en fil med navnet - i eksempler som:

    cat - 

Kommentarer

  • Da jeg tilsyneladende skal have 50 ry for at kommentere direkte .. På / dev / stdin / dev / stdout-kommentaren har AIX, som er et legitimt UNIX-derivat, ikke disse pseudodevices. Og som en yderligere kommentar er LINUX under ingen omstændigheder et UNIX-derivat. Det er en POSIX-kompatibel workalike, og den mest populære af UNIX-ish OS ' er på dette tidspunkt, men tag ikke fejl, dette er ingen UNIX. Men kernen i svarene her er korrekt. Noteringen " – " fortolkes ikke som speciel af skallen og overføres således direkte til hver enkelt applikation som en ARG. Hvis applikationen ikke genkendes
  • Der er også 2>&- konstruktion, hvilket betyder " tæt beskrivelse 2 ".
  • @ user95873, hvad jeg antager, at du ville sige er: mens Linux er Unix-lignende, ikke alle Unix-lignende (eller ægte UNIX) er Linux . Spørgsmålet om Linux er eller ikke er ' t sand UNIX (dvs. overholder den enkelte UNIX-specifikation) har ikke ' t relation til / dev / std {in, out, err} problem. Som / dev / std {in, out, err} er tilføjet funktion, ikke mangler .

Svar

Brug af - som filnavn for at betyde stdin / stdout er en konvention, som mange programmer bruger. Det er ikke en særlig egenskab ved filnavnet. Kernen genkender ikke - som speciel, så ethvert systemopkald der henviser til - som et filnavn bruger - bogstaveligt talt som filnavnet.

Med bash-omdirigering genkendes - ikke som et specielt filnavn, så bash vil bruge det som det bogstavelige filnavn.

Når cat ser strengen - som et filnavn, behandles den som et synonym for stdin. For at omgå dette skal du ændre den streng, som cat ser på en sådan måde, at den stadig henviser til en fil, der hedder -. Den sædvanlige måde at gøre dette på er at placere filnavnet foran en sti – ./- eller /home/Tim/-. Denne teknik bruges også til at omgå lignende problemer, hvor kommandolinjemuligheder kolliderer med filnavne, så en fil, der kaldes ./-e, vises ikke som -e kommandolinjevalg til et program, for eksempel.

Kommentarer

  • Det ' s værd at tilføje, at /dev/stdin og /dev/stdout er universelt tilgængelige og kan bruges i stedet for - konvention.
  • @jmtd: / dev / std {in, out} er ikke universelt tilgængelige. Ikke alle unixer har det.
  • Interessant, jeg antog, at de var en del af POSIX (men kan ' ikke bekræfte). De ' findes i det mindste på Linux, BSDerne og Solaris. Kan du give et eksempel på en moderne UNIX, der mangler dem?
  • @camh Ikke sikker på, om du har fået underretningen, og dette er et meget, meget gammelt emne; Jeg ' er ikke sikker på, om du kan, men jeg ' er meget nysgerrig, hvis du kender svaret til jmtd ' spørgsmål? 🙂
  • @jmtd Jeg synes at have fundet et foreløbigt svar på spørgsmålet: unix.stackexchange.com/a/278368/31669

Svar

  1. I stedet for echo hello > -, kan du bruge echo hello > /dev/stdout.

    Mens “-” er en konvention, der skal implementeres af hvert program, der ønsker at understøtte det, /dev/stdin, /dev/stdout og /dev/stderr er, når de understøttes af operativsystemet (i det mindste gør Solaris, Linux og BSDer) uafhængig af applikationen og fungerer derefter som du har tænkt dig.

Svar

Som camh nævnt , - er bare en navngivningskonvention, der bruges af nogle programmer.Hvis du vil henvise til disse streams med en filbeskrivelse, skal skallen genkende, jiliagre var korrekt , da du brugte navnet /dev/stdin eller /dev/stdout i stedet. Disse filnavne skal fungere ethvert sted, hvor et normalt filnavn fungerer.

  1. Når det er sagt, er dit første eksempel lidt fjollet. Ethvert output, der vil blive fanget af omdirigeringsoperatøren for at skrive til en fil, er allerede ON standard-output, så omdirigere det og skrive det tilbage til, hvor det kom fra, er ubrugeligt. Den adfærd, du bruger der, er røret, ikke en omdirigering:

    echo hello | 
  2. I dit andet eksempel skal du blot give kan nogle indikation af, at du vil have en kuldfil med det navn, ikke det interne alias, den har. Du kan gøre dette nemmest ved at angive en sti til filen på denne måde:

    cat ./- 

Svar

Hvad angår 1, skal programmet støtte det. Du kan ikke bare vilkårligt bruge det. Hvad angår 2, omdiriger input fra (f.eks. cat < -).

Svar

Metoden “-” har mange problemer. Først og fremmest kræver det en fortolkning af karakteren “-“, og mange programmer udfører ikke en sådan fortolkning. Og desuden er der nogle programmer, der fortolker en bindestreg som en afgrænsning, der markerer afslutningen på kommandolinjevalg. Programmerne er skrevet til at arbejde med filnavnargumenter, “-” tilgang er et hack, pænt men svagt.

Den bedste måde er:

$ echo hello > /dev/fd/1 

/dev/stdout er et symbolik-link til /dev/fd/1

Kommentarer

  • Omdirigering fortolkes af skallen og ikke af programmet, der påberåbes.

Svar

Specialtegn har for det meste to betydninger:

ASCII-numerisk diagram.

Scripting eller symbolsk.

Det er muligt, at et enkelt tegn repræsenterer en streng eller fungerer som en streng. Efter min forståelse.

på C-sprog fopen() -funktionen tager to argumenter, første filstrøm og den anden tilstand, hvor filen vil være åben. tilstanden er en streng. selvom det er et enkelt tegn.

cat > " – " fungerer.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *