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/stdinog/dev/stdouter 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/stdoutog/dev/stderrer, 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 ".