For en kommando, hvis du bruger -
som argument i stedet for et filnavn betyder STDIN eller STDOUT.
-
Men i dette eksempel opretter det en fil med navnet
-
:echo hello > -
Hvordan kan jeg få
-
til at betyde STDOUT i dette eksempel? -
Omvendt, hvordan kan jeg få
-
til at betyde en fil med navnet-
i eksempler som:cat -
Kommentarer
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
-
I stedet for
echo hello > -
, kan du brugeecho 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.
-
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 |
-
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.
2>&-
konstruktion, hvilket betyder " tæt beskrivelse 2 ".