A kötőjel (-) használata fájlnév helyett

Parancshoz, ha argumentumként - -t használ fájlnév helyett STDIN vagy STDOUT jelent.

  1. De ebben a példában egy - nevű fájlt hoz létre:

    echo hello > - 

    Hogyan érhetem el, hogy a - ebben a példában STDOUT-ot jelent?

  2. Ezzel ellentétben hogyan tehetem - - nevű fájlt a következő példákban:

    cat - 

Megjegyzések

  • Mivel nyilvánvalóan 50 hírnévvel kell rendelkeznem, hogy közvetlenül hozzászólhassak. A / dev / stdin / dev / stdout megjegyzésben az AIX-nek, amely egy legitim UNIX-származék, nincsenek ezek az áleszközök. És további megjegyzésként a LINUX semmilyen esetben sem UNIX-származék. Ez egy POSIX-kompatibilis munka, és a legnépszerűbb az UNIX-is OS ' ek közül ezen a ponton, de ne tévedjen, ez nem UNIX. De az itteni válaszok lényege helytálló. A " – " jelölést a héj nem értelmezi különlegesen, és így ARG-ként közvetlenül továbbítja minden egyes alkalmazásnak. Ha az alkalmazás nem ismeri fel
  • Létezik 2>&- szerkesztés is, ami azt jelenti, hogy " 2 szoros leíró ".
  • @ user95873, azt hiszem, ezt akartad mondani: míg a Linux Unix-szerű, nem minden Unix-szerű (vagy valódi UNIX) Linux . Az, hogy a Linux nem ' t igaz UNIX (azaz megfelel az egységes UNIX specifikációnak), nincs ' kapcsolata a / dev / std {be, ki, tévedés} kérdés. Mivel a / dev / std {in, out, err} hozzáadva funkció, nem hiányzik .

Válasz

A - fájlnévként való használata az stdin / stdout jelentésére olyan konvenció, amelyet sok program használ. Ez nem a fájlnév különleges tulajdonsága. A kernel nem ismeri fel a (z) - fájlt speciálisként, ezért minden olyan rendszerhívás, amely fájlnévként hivatkozik a - fájlra, a következőt fogja használni: - szó szerint fájlnévként.

A bash átirányítással a - nem ismerhető el speciális fájlnévként, ezért a bash ezt szó szerinti fájlnévként fogja használni.

Amikor a cat fájlnévnek tekinti a - sztringet, a stdin szinonimájaként kezeli. Ahhoz, hogy ezt megkerülje, meg kell változtatnia a cat által látott karakterláncot oly módon, hogy még mindig a - nevű fájlra utal. Ennek szokásos módja, ha a fájlnevet előtaggal – ./- vagy /home/Tim/- adja meg. Ezt a technikát használják olyan hasonló problémák kiküszöbölésére is, ahol a parancssori beállítások ütköznek a fájlnevekkel, így a ./-e néven említett fájl nem jelenik meg a -e parancssori opció például egy programhoz.

Megjegyzések

  • Ez ' s érdemes hozzátenni, hogy a /dev/stdin és a /dev/stdout univerzálisan elérhetőek, és a - konvenció.
  • @jmtd: / dev / std {be, ki} nem érhetők el egyetemesen. Nem minden unix-en van.
  • Érdekes, feltételeztem, hogy a POSIX részei (de ' nem erősíthetik meg). ' legalább Linuxon, a BSD-ken és a Solaris-on vannak jelen. Mondana példát egy modern UNIX-ra, amelyből hiányzik?
  • @camh Nem biztos abban, hogy megkapta-e az értesítést, és ez egy nagyon-nagyon régi téma; Én ' nem vagyok biztos benne, hogy tudsz-e, de én ' nagyon kíváncsi vagyok, ha tudod a ' kérdés? 🙂
  • @jmtd úgy tűnik, hogy kísérleti választ találtam a következő kérdésre: unix.stackexchange.com/a/278368/31669

Válasz

  1. A echo hello > -, használhatja a echo hello > /dev/stdout parancsot.

    Míg a “-” egy olyan konvenció, amelyet minden támogatni kívánó programnak végre kell hajtania, /dev/stdin, /dev/stdout és /dev/stderr támogatott, ha az operációs rendszer támogatja (legalábbis a Solaris, a Linux és a BSD) , függetlenül az alkalmazástól, majd a szándékának megfelelően fog működni.

Válasz

Mint camh említett , a - csak egy elnevezési eljárás, amelyet egyes programok használnak.Ha ezekre a folyamokra egy fájlleíróval kíván hivatkozni, amelyet a shell felismer, a jiliagre helyes volt , amikor a /dev/stdin vagy /dev/stdout helyett. Ezeknek a fájlneveknek minden olyan helyen működniük kell, ahol egy normális fájlnév működne.

  1. Ennek ellenére az első példád buta. Bármely olyan kimenet, amelyet az átirányító operátor elkapna egy fájlba való íráshoz, már BE van kapcsolva a normál kimeneten, így hiába irányítja át és írja vissza oda, ahonnan jött. Az ott használt viselkedés a cső, nem pedig az átirányítás:

    echo hello | 
  2. A második példában egyszerűen meg kell adnia néhányat jelzi, hogy egy ilyen nevű lomfájlt szeretne, nem pedig a belső álnevét. Ezt úgy teheti meg a legkönnyebben, ha megadja a fájl elérési útját, így:

    cat ./- 

Válasz

Ami az 1-et illeti, a programnak támogatnia kell. Nem lehet önkényesen használni. Ami a 2-et illeti, irányítsa át a bemenetet (pl. cat < -).

Válasz

A “-” megközelítésnek sok problémája van. Először is a “-” karakter értelmezésére van szükség, és sok program nem hajt végre ilyen értelmezést. Ezenkívül vannak olyan programok, amelyek a kötőjelet a parancssori opciók végét jelző elválasztóként értelmezik. A programokat fájlnév-argumentumokkal dolgozták, a “-” megközelítés hack, szép, de gyenge.

A legjobb módszer:

$ echo hello > /dev/fd/1 

/dev/stdout a /dev/fd/1

megjegyzések

  • Az átirányítást a shell értelmezi, nem a meghívott program.

Válasz

A speciális karaktereknek többnyire két jelentése van:

ASCII numerikus diagram.

Szkript vagy szimbolikus.

Lehetséges, hogy egyetlen karakter egy karakterláncot képvisel, vagy karakterként karakterláncként működik. Értelmezésem szerint.

C nyelven >

függvény két argumentumot vesz igénybe: az első fájlfolyamot és a második módot, amelyben a fájl megnyílik. Az üzemmód egy karakterlánc. Még akkor is, ha egyetlen karakter.

cat > " – " működik.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük