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/stdinja/dev/stdoutovat 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/stdoutja/dev/stderrovat, 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 ".