For en kommando, hvis du bruker -
som argument i stedet for et filnavn vil bety STDIN eller STDOUT.
-
Men i dette eksemplet oppretter den en fil med navnet
-
:echo hello > -
Hvordan kan jeg gjøre at
-
i dette eksemplet betyr STDOUT? -
Omvendt, hvordan kan jeg få
-
til å bety en fil som heter-
i eksempler som:cat -
Kommentarer
Svar
Å bruke -
som filnavn for å bety stdin / stdout er en konvensjon som mange programmer bruker. Det er ikke en spesiell egenskap for filnavnet. Kjernen kjenner ikke igjen -
som spesiell, så alle systemanrop som refererer til -
som filnavn vil bruke -
bokstavelig talt som filnavnet.
Med bash-omdirigering blir -
ikke gjenkjent som et spesielt filnavn, så bash vil bruke det som det bokstavelige filnavnet.
Når cat
ser strengen -
som et filnavn, behandles den som et synonym for stdin. For å komme deg rundt dette, må du endre strengen som cat
ser på en slik måte at den fremdeles refererer til en fil som heter -
. Den vanlige måten å gjøre dette på er å foran filnavnet med en bane – ./-
, eller /home/Tim/-
. Denne teknikken brukes også for å komme rundt lignende problemer der kommandolinjealternativer kolliderer med filnavn, så en fil referert til som ./-e
vises ikke som -e
for eksempel kommandolinjealternativ til et program.
Kommentarer
- Det ' s verdt å legge til at
/dev/stdin
og/dev/stdout
er allment tilgjengelige og kan brukes i stedet for-
konvensjon. - @jmtd: / dev / std {in, out} er ikke allment tilgjengelig. Ikke alle unixer har det.
- Interessant, jeg antok at de var en del av POSIX (men kan ' t bekrefte). De ' er tilstede i det minste på Linux, BSD og Solaris. Kan du gi et eksempel på en moderne UNIX som mangler dem?
- @camh Ikke sikker på om du fikk varselet, og dette er et veldig, veldig gammelt emne; Jeg ' er ikke sikker på om du kan, men jeg ' er veldig nysgjerrig på om du vet svaret på
jmtd
' spørsmål? 🙂 - @jmtd Jeg ser ut til å ha funnet et foreløpig svar på spørsmålet: unix.stackexchange.com/a/278368/31669
Svar
-
I stedet for
echo hello > -
, kan du brukeecho hello > /dev/stdout
.Mens «-» er en konvensjon som må implementeres av hvert program som ønsker å støtte det,
/dev/stdin
,/dev/stdout
og/dev/stderr
er, når de støttes av operativsystemet (i det minste gjør Solaris, Linux og BSDs) , uavhengig av applikasjonen, og vil da fungere som du har tenkt.
Svar
Som camh nevnt , -
er bare en navnekonvensjon som brukes av noen programmer.Hvis du vil referere til disse strømningene med en filbeskrivelse, vil skallet gjenkjenne, jiliagre var riktig fordi du brukte navnet /dev/stdin
eller /dev/stdout
i stedet. Disse filnavnene skal fungere hvor som helst et vanlig filnavn ville fungere.
-
Når det er sagt, er ditt første eksempel litt dumt. Enhver utgang som vil bli fanget av omdirigeringsoperatøren for å skrive til en fil, er allerede PÅ standardutdata, så omdirigering og skriving tilbake til hvor den kom fra er ubrukelig. Oppførselen du bruker der er røret, ikke en viderekobling:
echo hello |
-
I det andre eksemplet ditt trenger du bare å gi kan noen indikasjon på at du vil ha en søppelfil med det navnet, ikke det interne aliaset det har. Du kan gjøre dette enklest ved å spesifisere en bane til filen slik:
cat ./-
Svar
Når det gjelder 1, må programmet støtte det. Du kan ikke bare bruke den vilkårlig. Når det gjelder 2, viderekoble input fra (f.eks. cat < -
).
Svar
«-» tilnærmingen har mange problemer. Først og fremst krever det en tolkning av «-» karakteren, og mange programmer utfører ikke slik tolkning. Og videre er det noen programmer som tolker en bindestrek som en avgrensning som markerer slutten på kommandolinjealternativene. Programmene er skrevet for å fungere med filnavnargumenter, «-» tilnærmingen er en hack, fin, men svak.
Den beste måten er:
$ echo hello > /dev/fd/1
/dev/stdout
er en symbolkobling av /dev/fd/1
Kommentarer
- Omadresseringen tolkes av skallet, ikke programmet som påkalles.
Svar
Spesialtegn har stort sett to betydninger:
ASCII numerisk diagram.
Skrift eller symbolsk.
Det er mulig at et enkelt tegn representerer en streng, eller fungerer som en streng. Etter min forståelse.
på C-språk fopen()
-funksjonen tar to argumenter, den første filstrømmen og den andre modusen der filen vil være åpen. modusen er en streng. selv om den er ett tegn.
cat > " – " fungerer.
2>&-
konstruksjon, som betyr " lukk deskriptor 2 ".