Parancshoz, ha argumentumként -
-t használ fájlnév helyett STDIN vagy STDOUT jelent.
-
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? -
Ezzel ellentétben hogyan tehetem
-
-
nevű fájlt a következő példákban:cat -
Megjegyzések
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
-
A
echo hello > -
, használhatja aecho 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.
-
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 |
-
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.
2>&-
szerkesztés is, ami azt jelenti, hogy " 2 szoros leíró ".