Komennolle, jos argumenttina käytetään -
tiedostonimen sijasta tarkoittaa STDIN tai STDOUT.
-
Mutta tässä esimerkissä se luo tiedoston nimeltä
-
:echo hello > -
Kuinka voin tehdä
-
tässä esimerkissä STDOUT? -
Vastaavasti miten voin
-
tarkoittaa tiedostoa nimeltä-
esimerkeissä kuten:cat -
Kommentit
std {in, out, err} -asia. Kun / dev / std {sisään, ulos, virhe] on lisätty , ei puutu .
Vastaa
-
-nimen käyttäminen tiedostonimenä tarkoittaa stdin / stdout on käytäntö, jota monet ohjelmat käyttävät. Se ei ole tiedostonimen erityinen ominaisuus. Ydin ei tunnista -
erityisenä, joten kaikki järjestelmäkutsut, jotka viittaavat tiedostoon -
tiedostona, käyttävät -
kirjaimellisesti tiedostonimenä.
Bash-uudelleenohjauksella -
ei tunnisteta erityiseksi tiedostonimeksi, joten bash käyttää sitä kirjaimellisena tiedostonimenä.
Kun cat
näkee merkkijonon -
tiedostonimenä, se käsittelee sitä stdinin synonyyminä. Tämän kiertämiseksi sinun on muutettava merkkijono, jonka cat
näkee siten, että se viittaa edelleen tiedostoon nimeltä -
. Tavallinen tapa tehdä se on lisätä tiedostonimi etuliitteeseen polku – ./-
tai /home/Tim/-
. Tätä tekniikkaa käytetään myös kiertämään vastaavia ongelmia, joissa komentorivivalinnat ovat ristiriidassa tiedostonimien kanssa, joten tiedostoa, johon viitataan nimellä ./-e
, ei näy nimellä -e
komentorivivalinta esimerkiksi ohjelmalle.
Kommentit
- Se ' s Lisäämisen arvoinen, että
/dev/stdin
ja/dev/stdout
ovat yleisesti saatavilla ja niitä voidaan käyttää-
käytäntö. - @jmtd: / dev / std {sisään, ulos} eivät ole yleisesti saatavilla. Kaikilla unixeilla ei ole sitä.
- Mielenkiintoista, oletin, että ne olivat osa POSIXia (mutta ' ei voi vahvistaa). He ' esiintyvät ainakin Linuxissa, BSD: ssä ja Solarisissa. Voitteko antaa esimerkin nykyaikaisesta UNIXista, josta puuttuu ne?
- @camh Etkö ole varma saitko ilmoituksen, ja tämä on hyvin, hyvin vanha aihe; En ' ole varma, pystytkö, mutta olen ' m erittäin utelias, jos tiedät vastauksen
jmtd
' kysymys? 🙂 - @jmtd Olen ilmeisesti löytänyt alustavan vastauksen kysymykseen: unix.stackexchange.com/a/278368/31669
Vastaa
-
Sen sijaan, että
echo hello > -
, voit käyttääecho hello > /dev/stdout
.Vaikka ”-” on käytäntö, joka on otettava käyttöön jokaisen ohjelman, joka haluaa tukea sitä,
/dev/stdin
,/dev/stdout
ja/dev/stderr
ovat, kun käyttöjärjestelmä tukee niitä (ainakin Solaris, Linux ja BSD) , riippumaton sovelluksesta ja toimii sitten aikeissasi.
Vastaa
Kuten camh mainittu , -
on vain joidenkin ohjelmien käyttämä nimeämistapa.Jos haluat viitata näihin virtoihin tiedostokuvaajalla, jonka komentotulkki tunnistaa, jiliagre oli oikea käytettäessä nimeä /dev/stdin
tai /dev/stdout
. Näiden tiedostonimien tulisi toimia missä tahansa paikassa, jossa normaali tiedostonimi toimisi.
-
Tästä huolimatta ensimmäinen esimerkkisi on typerä. Kaikki lähdöt, jotka uudelleenohjausoperaattori kiinnittää kirjoittamaan tiedostoon, ovat jo ON-standardilähdössä, joten sen uudelleenohjaaminen ja kirjoittaminen takaisin mistä se on peräisin, on hyödytöntä. Käyttämäsi käyttäytyminen on putki, ei uudelleenohjaus:
echo hello |
-
Toisessa esimerkissä sinun on yksinkertaisesti annettava merkintä siitä, että haluat saman nimisen roskatiedoston, ei sen sisäistä aliasta. Voit tehdä tämän helpoimmin määrittämällä polun tiedostolle näin:
cat ./-
Vastaa
Mitä tulee kohtaan 1, ohjelman on tuettava sitä. Et voi käyttää sitä vain mielivaltaisesti. Mitä tulee kohtaan 2, ohjaa tulo osoitteesta (esim. cat < -
).
Vastaa
”-” -lähestymistavalla on paljon ongelmia. Ensinnäkin se edellyttää ”-” -merkin tulkintaa ja monet ohjelmat eivät suorita tällaista tulkintaa. Lisäksi on joitain ohjelmia, jotka tulkitsevat yhdysmerkin erottajana, joka merkitsee komentorivivalintojen loppua. Ohjelmat on kirjoitettu toimimaan tiedostonimi argumenttien kanssa, ”-” lähestymistapa on hakkerointi, mukava mutta heikko.
Paras tapa on:
$ echo hello > /dev/fd/1
/dev/stdout
on symboli-linkki /dev/fd/1
kommenteista
- Suoja tulkitsee uudelleenohjauksen, ei ohjelmaa, jota kutsutaan.
Vastaa
Erikoismerkeillä on enimmäkseen kaksi merkitystä:
ASCII-numeerinen kaavio.
Komentosarja tai symbolinen.
On mahdollista, että yksi merkki edustaa merkkijonoa tai toimii merkkijonona. Ymmärrykseni.
C-kielellä fopen()
-toiminto vie kaksi argumenttia ensimmäisen tiedostovirran ja toisen tilan, jossa tiedosto on avoinna. tila on merkkijono. vaikka se olisikin yksi merkki.
cat > " – " toimii.
2>&-
-rakenne, mikä tarkoittaa " sulje kuvaaja 2 ".