Gebruik van een streepje (-) in plaats van een bestandsnaam

Voor een commando, als - als argument wordt gebruikt in plaats van een bestandsnaam betekent STDIN of STDOUT.

  1. Maar in dit voorbeeld maakt het een bestand aan met de naam -:

    echo hello > - 

    Hoe kan ik - in dit voorbeeld STDOUT laten betekenen?

  2. Omgekeerd, hoe kan ik ervoor zorgen dat - een bestand betekent met de naam - in voorbeelden zoals:

    cat - 

Reacties

  • Aangezien ik blijkbaar 50 reputatie moet hebben om rechtstreeks commentaar te geven .. Op het / dev / stdin / dev / stdout commentaar heeft AIX, dat een legitieme UNIX-afgeleide is, deze pseudodevices niet. En, als een verdere opmerking, LINUX is in ieder geval geen UNIX-derivaat. Het is een POSIX-compatibele workalike, en het meest populaire van het UNIX-achtige besturingssysteem ‘ s op dit moment, maar vergis je niet, dit is geen UNIX. Maar de kern van de antwoorden hier is correct. De ” – ” -notatie wordt door de shell niet als speciaal geïnterpreteerd en wordt dus direct als een ARG naar elke individuele applicatie gestuurd. Als de applicatie niet herkenti
  • Er zijn ook 2>&- constructie, wat betekent ” sluit descriptor 2 “.
  • @ user95873, wat ik veronderstel dat je wilde zeggen is: terwijl Linux Unix-achtig is, is niet elke Unix-achtige (of echte UNIX) Linux . De kwestie of Linux niet ‘ t true UNIX is (dwz voldoet aan de Single UNIX-specificatie) heeft geen ‘ t betrekking op / dev / std {in, out, err} probleem. As / dev / std {in, out, err} is een toegevoegde functie, ontbreekt niet .

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

  1. In plaats van echo hello > -, je kunt echo 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.

  1. 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 | 
  2. 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *