För ett kommando, om du använder -
som argument istället för ett filnamn betyder STDIN eller STDOUT.
-
Men i det här exemplet skapar den en fil med namnet
-
:echo hello > -
Hur kan jag göra att
-
i det här exemplet betyder STDOUT? -
Omvänt, hur kan jag göra att
-
betyder en fil med namnet-
i exempel som:cat -
Kommentarer
Svar
Att använda -
som filnamn för att betyda stdin / stdout är en konvention som många program använder. Det är inte en speciell egenskap för filnamnet. Kärnan känner inte igen -
som speciell så alla systemanrop som hänvisar till -
som filnamn använder -
bokstavligen som filnamn.
Med bash-omdirigering känns inte -
som ett speciellt filnamn, så bash kommer att använda det som bokstavligt filnamn.
När cat
ser strängen -
som ett filnamn behandlas den som en synonym för stdin. För att komma runt detta måste du ändra strängen som cat
ser på ett sådant sätt att den fortfarande hänvisar till en fil som heter -
. Det vanliga sättet att göra detta är att föregå filnamnet med en sökväg – ./-
eller /home/Tim/-
. Denna teknik används också för att komma runt liknande problem där kommandoradsalternativ kolliderar med filnamn, så en fil som kallas ./-e
visas inte som -e
till exempel kommandoradsalternativ till ett program.
Kommentarer
- Det ' s värt att lägga till att
/dev/stdin
och/dev/stdout
är allmänt tillgängliga och kan användas istället för-
konvention. - @jmtd: / dev / std {in, out} är inte allmänt tillgängliga. Inte alla unix har det.
- Intressant, jag antog att de var en del av POSIX (men kan ' inte bekräfta). De ' finns åtminstone på Linux, BSD och Solaris. Kan du ge ett exempel på en modern UNIX som saknar dem?
- @camh Inte säker på om du fick meddelandet, och det här är ett mycket, mycket gammalt ämne; Jag ' är inte säker på om du kan, men jag ' är väldigt nyfiken på om du vet svaret på
jmtd
' s fråga? 🙂 - @jmtd Jag verkar ha hittat ett preliminärt svar på frågan: unix.stackexchange.com/a/278368/31669
Svar
-
I stället för
echo hello > -
kan du användaecho hello > /dev/stdout
.Medan ”-” är en konvention som måste implementeras av varje program som vill stödja det,
/dev/stdin
,/dev/stdout
och/dev/stderr
är, när de stöds av operativsystemet (åtminstone gör Solaris, Linux och BSD) , oberoende av applikationen och fungerar sedan som du tänker.
Svar
Som camh nämns , -
är bara en namngivningskonvention som används av vissa program.Om du vill hänvisa till dessa strömmar med en filbeskrivare kommer skalet att känna igen, jiliagre var korrekt när du använde namnet /dev/stdin
eller /dev/stdout
istället. Dessa filnamn borde fungera var som helst som ett normalt filnamn skulle fungera.
-
Med detta sagt är ditt första exempel typ av dumt. Alla utdata som skulle fångas av omdirigeringsoperatören för att skriva till en fil är redan PÅ standardutdata, så att omdirigera den och skriva tillbaka till var den kom ifrån är värdelös. Det beteende du använder där är röret, inte en omdirigering:
echo hello |
-
I ditt andra exempel behöver du helt enkelt ge kan några indikation på att du vill ha en kullfil med det namnet, inte det interna alias som den har. Du kan göra det enklast genom att ange en sökväg till filen så här:
cat ./-
Svar
När det gäller 1 måste programmet stödja det. Du kan inte bara använda den godtyckligt. När det gäller 2 omdirigerar du inmatning från (t.ex. cat < -
).
Svar
Metoden ”-” har många problem. Först och främst kräver det en tolkning av karaktären ”-” och många program utför inte sådan tolkning. Och dessutom finns det några program som tolkar ett bindestreck som en avgränsare som markerar slutet på kommandoradsalternativen. Programmen är skrivna för att fungera med filnamnargument, ”-” -metoden är ett hack, trevligt men svagt.
Det bästa sättet är:
$ echo hello > /dev/fd/1
/dev/stdout
är en symbolik länk till /dev/fd/1
Kommentarer
- Omdirigeringen tolkas av skalet, inte programmet som åberopas.
Svar
Specialtecken har mestadels två betydelser:
ASCII-numeriskt diagram.
Skript eller symboliskt.
Det är möjligt att ett enda tecken representerar en sträng, eller fungerar som en sträng. Enligt min förståelse.
på C-språk fopen()
-funktionen tar två argument, första filströmmen och det andra läget där filen kommer att vara öppen. läget är en sträng. även om den är enstaka tecken.
cat > " – " fungerar.
2>&-
konstruktion, vilket betyder " nära beskrivning 2 ".