Voor een commando, als -
als argument wordt gebruikt in plaats van een bestandsnaam betekent STDIN of STDOUT.
-
Maar in dit voorbeeld maakt het een bestand aan met de naam
-
:echo hello > -
Hoe kan ik
-
in dit voorbeeld STDOUT laten betekenen? -
Omgekeerd, hoe kan ik ervoor zorgen dat
-
een bestand betekent met de naam-
in voorbeelden zoals:cat -
Reacties
Antwoord
Het gebruik van -
als een bestandsnaam om stdin / stdout aan te duiden is een conventie die veel programmas gebruiken. Het is geen speciale eigenschap van de bestandsnaam. De kernel herkent -
niet als speciaal, dus alle systeemaanroepen die verwijzen naar -
als bestandsnaam zullen -
letterlijk als de bestandsnaam.
Met bash-omleiding wordt -
niet herkend als een speciale bestandsnaam, dus bash zal die als de letterlijke bestandsnaam gebruiken.
Wanneer cat
de string -
als een bestandsnaam ziet, behandelt het deze als een synoniem voor stdin. Om dit te omzeilen, moet je de string die cat
ziet, zodanig wijzigen dat deze nog steeds verwijst naar een bestand met de naam -
. De gebruikelijke manier om dit te doen is om de bestandsnaam te prefixen met een pad – ./-
, of /home/Tim/-
. Deze techniek wordt ook gebruikt om soortgelijke problemen te omzeilen waarbij opdrachtregelopties botsen met bestandsnamen, dus een bestand waarnaar wordt verwezen als ./-e
wordt niet weergegeven als het -e
opdrachtregeloptie voor een programma, bijvoorbeeld.
Opmerkingen
- Het ‘ s de moeite waard om toe te voegen dat
/dev/stdin
en/dev/stdout
universeel beschikbaar zijn en kunnen worden gebruikt in plaats van de-
conventie. - @jmtd: / dev / std {in, out} zijn niet universeel beschikbaar. Niet alle unixen hebben het.
- Interessant, ik nam aan dat ze deel uitmaakten van POSIX (maar kan ‘ niet bevestigen). Ze ‘ zijn tenminste aanwezig op Linux, de BSDs en Solaris. Kun je een voorbeeld geven van een moderne UNIX die ze niet heeft?
- @camh Weet niet zeker of je de melding hebt gekregen, en dit is een heel, heel oud onderwerp; Ik ‘ m niet zeker of je het kunt, maar ik ‘ ben erg benieuwd of je het antwoord weet op
jmtd
‘ s vraag? 🙂 - @jmtd Ik heb blijkbaar een voorlopig antwoord gevonden op de vraag: unix.stackexchange.com/a/278368/31669
Antwoord
-
In plaats van
echo hello > -
, je kuntecho hello > /dev/stdout
gebruiken.Terwijl “-” een conventie is die moet worden geïmplementeerd door elk programma dat het wil ondersteunen,
/dev/stdin
,/dev/stdout
en/dev/stderr
zijn, indien ondersteund door het besturingssysteem (tenminste Solaris, Linux en BSDs doen) , onafhankelijk van de applicatie en zal dan werken zoals u van plan bent.
Antwoord
Als camh genoemd , -
is slechts een naamgevingsconventie die door sommige programmas wordt gebruikt.Als je naar deze streams wilt verwijzen met een bestandsbeschrijving die de shell zal herkennen, jiliagre was correct doordat je de naam /dev/stdin
of /dev/stdout
. Die bestandsnamen zouden overal moeten werken waar een normale bestandsnaam zou werken.
-
Dat gezegd hebbende, is je eerste voorbeeld nogal dom. Elke uitvoer die door de omleidingsoperator zou worden opgevangen om naar een bestand te schrijven, staat al AAN standaarduitvoer, dus het omleiden en terugschrijven naar waar het vandaan kwam, is nutteloos. Het gedrag dat je daar gebruikt is de pipe, niet een omleiding:
echo hello |
-
In je tweede voorbeeld hoef je gewoon wat indicatie dat u een letterlijk bestand met die naam wilt, niet de interne alias die het heeft. U kunt dit het gemakkelijkst doen door als volgt een pad naar het bestand op te geven:
cat ./-
Antwoord
Wat betreft 1, het programma moet het ondersteunen. Je kunt het niet zomaar willekeurig gebruiken. Wat betreft 2, voer de invoer om van (bijv. cat < -
).
Antwoord
De “-” benadering heeft veel problemen. Allereerst vereist het een interpretatie van het “-” teken en veel programmas voeren een dergelijke interpretatie niet uit. En verder zijn er enkele programmas die een koppelteken interpreteren als een scheidingsteken dat het einde van opdrachtregelopties aangeeft. De programmas zijn geschreven om met argumenten voor bestandsnamen te werken, de “-” benadering is een hack, mooi maar zwak.
De beste manier is:
$ echo hello > /dev/fd/1
/dev/stdout
is een symbolische link van /dev/fd/1
Reacties
- De omleiding wordt geïnterpreteerd door de shell, niet door het programma dat wordt aangeroepen.
Answer
Speciale tekens hebben meestal twee betekenissen:
ASCII numeriek diagram.
Scripting of symbolisch.
Het is mogelijk dat een enkel teken een tekenreeks vertegenwoordigt, of fungeert als een tekenreeks. Zoals ik begrepen heb.
in C-taal fopen()
functie heeft twee argumenten: eerste bestandsstroom en de tweede modus waarin het bestand geopend zal zijn. de modus is een string. zelfs als het een enkel teken is.
cat > ” – ” werkt.
2>&-
constructie, wat betekent ” sluit descriptor 2 “.