Ką „2> 1“ reiškia apvalkale?

„Unix“ korpuse, jei noriu sujungti stderr ir stdout į stdout srautą tolesniam apdorojimui, mano komandos pabaigoje galiu pridėti:

 2>> 

Taigi, jei noriu naudoti galvą iš g ++ išvesties, galiu padaryti kažką panašaus:

 g++ lots_of_errors 2> | head 

todėl matau tik pirmas kelias klaidas.

Visada man tai sunku prisiminti, ir man reikia nuolat ją ieškoti, ir tai daugiausia priklauso nuo to, kad visiškai nesuprantu šios konkrečios gudrybės sintaksės. Ar kas nors gali jį sugadinti ir paaiškinti požymį pagal pobūdį, o tai reiškia „2> ir 1“?

1554
04 мая '09 в 1:57 2009-05-04 01:57 Tristan Havelick paklausė gegužės 04 '09, 1:57 2009-05-04 01:57
@ 16 atsakymų

1 failo deskriptorius yra standartinė išvestis (stdout).
2 failo deskriptorius yra standartinė klaida (stderr).

Štai vienas iš būdų prisiminti šį statinį (nors tai ne visai tiksliai): iš pradžių 2>1 gali atrodyti kaip geras būdas nukreipti stderr į stdout. Tačiau iš tikrųjų jis bus aiškinamas kaip „nukreipti stderr į failą, pavadintą 1 “. > nurodo, kad kitas yra failo deskriptorius, o ne failo pavadinimas. Taigi konstrukcija tampa: 2>> .

1763 m
04 мая '09 в 2:04 2009-05-04 02:04 atsakė Ayman Hourieh gegužės 09 d. 02:04 2009-05-04 02:04
 echo test > afile.txt 

.. nukreipia stdout į afile.txt . Tai yra tas pats, kaip daryti.

 echo test 1> afile.txt 

Jei norite nukreipti stderr, jūs ...

 echo test 2> afile.txt 

>> yra sintaksė nukreipti srautą į kitą failo deskriptorių - 0 yra stdin. 1 - standartinis išėjimas. 2 - stderr.

border=0

Stdout galite nukreipti į stderr.

 echo test 1> # or echo test >> 

.. arba atvirkščiai:

 echo test 2>> 

Taip trumpesnis .. 2> nukreipia stderr į (nenurodytą) failą, pridedant > redirects stderr į stdout

436
04 мая '09 в 1:59 2009-05-04 01:59 atsakymas yra dbr 04 gegužės '09 at 1:59 2009-05-04 01:59

Kai kurie nukreipimo gudrybės

Kai kurios sintaksės funkcijos gali turėti svarbų elgesį. Yra keletas nedidelių nukreipimų pavyzdžių: STDERR , STDOUT ir užsakymo argumentai.

1 - perrašyti arba pridėti?

Simbolis > nurodo peradresavimą.

  • > reiškia viso failo siuntimą kaip visumą, perrašant tikslą, jei jis yra (žr. noclobber bash funkciją # 3 vėliau).
  • >> reiškia, kad siuntimas bus pridėtas prie tikslo, jei jis yra.

Bet kuriuo atveju failas bus sukurtas, jei jo nėra.

2 - Shell komandinė eilutė priklauso nuo užsakymo !!

Norėdami tai patikrinti, mums reikia paprastos komandos, kuri atsiųs kažką į abu rezultatus:

 $ ls -ld /tmp /tnt ls: cannot access /tnt: No such file or directory drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp $ ls -ld /tmp /tnt >/dev/null ls: cannot access /tnt: No such file or directory $ ls -ld /tmp /tnt 2>/dev/null drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp 

(Tikimasi, kad neturite pavadinimo pavadinimo /tnt , žinoma;). Na, mes turime jį!

Taigi, žiūrėkime:

 $ ls -ld /tmp /tnt >/dev/null ls: cannot access /tnt: No such file or directory $ ls -ld /tmp /tnt >/dev/null 2> $ ls -ld /tmp /tnt 2> >/dev/null ls: cannot access /tnt: No such file or directory 

Paskutinė STDERR komandinės eilutės sąvartynė, atrodo, nėra tikėtinas elgesys ... Bet ...

Jei norite atlikti kai kuriuos pranešimus apie vieną išvestį, kitą arba abu:

 $ ls -ld /tmp /tnt | sed 's/^.*$/<--  --->/' ls: cannot access /tnt: No such file or directory <-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp ---> $ ls -ld /tmp /tnt 2> | sed 's/^.*$/<--  --->/' <-- ls: cannot access /tnt: No such file or directory ---> <-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp ---> $ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<--  --->/' ls: cannot access /tnt: No such file or directory $ ls -ld /tmp /tnt >/dev/null 2> | sed 's/^.*$/<--  --->/' $ ls -ld /tmp /tnt 2> >/dev/null | sed 's/^.*$/<--  --->/' <-- ls: cannot access /tnt: No such file or directory ---> 

Atkreipkite dėmesį, kad paskutinė komanda šioje dalyje yra lygiai tokia pati, kaip ir ankstesnėje pastraipoje, kur parašiau, atrodo, kad tai nėra tikėtinas elgesys (taigi jis gali būti net tikėtinas elgesys).

Na, yra keletas peradresavimo gudrybių, skirtingų operacijų vykdymui abiejose operacijose :

 $ ( ls -ld /tmp /tnt | sed 's/^/O: /' > ) 9> 2> | sed 's/^/E: /' O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp E: ls: cannot access /tnt: No such file or directory 

Nota: > deskriptorius atsiras spontaniškai, nes ) 9>> .

Priedas: nota! Su nauja „ versija ( >4.0 ) atsirado nauja funkcija ir daugiau seksualinės sintaksės, skirtos atlikti tokius veiksmus:

 $ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /') O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp E: ls: cannot access /tnt: No such file or directory 

Ir galiausiai, šis pakopinis išvesties formatas:

 $ ((ls -ld /tmp /tnt |sed 's/^/O: /' > ) 2> |sed 's/^/E: /') 9> cat -n 1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp 2 E: ls: cannot access /tnt: No such file or directory 

Priedas: nota! Ta pati sintaksė abiem kryptimis:

 $ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')) 1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp 2 E: ls: cannot access /tnt: No such file or directory 

Kai STDOUT pereina per tam tikrą filtrą, STDERR į kitą, ir galiausiai, abu išėjimai kartu sujungiami per trečiąjį komandų filtrą.

3 - žodis apie „ noclobber ir sintaksę >|

Ką apie perrašymas :

Nors „ set -o noclobber nurodo „bash“ neperrašyti jokių esamų failų, sintaksė yra >| leidžia jums perduoti šią ribą:

 $ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX) $ date > $testfile ; cat $testfile Mon Jan 7 13:18:15 CET 2013 $ date > $testfile ; cat $testfile Mon Jan 7 13:18:19 CET 2013 $ date > $testfile ; cat $testfile Mon Jan 7 13:18:21 CET 2013 

Failas perrašomas kiekvieną kartą, gerai dabar:

 $ set -o noclobber $ date > $testfile ; cat $testfile bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file Mon Jan 7 13:18:21 CET 2013 $ date > $testfile ; cat $testfile bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file Mon Jan 7 13:18:21 CET 2013 

Eikite per >| :

 $ date >| $testfile ; cat $testfile Mon Jan 7 13:18:58 CET 2013 $ date >| $testfile ; cat $testfile Mon Jan 7 13:19:01 CET 2013 

Atjunkite šią parinktį ir / arba užklausą, jei ji jau įdiegta.

 $ set -o | grep noclobber noclobber on $ set +o noclobber $ set -o | grep noclobber noclobber off $ date > $testfile ; cat $testfile Mon Jan 7 13:24:27 CET 2013 $ rm $testfile 

4 - paskutinis triukas ir daugiau ...

Jei norite peradresuoti abi iš šios komandos išvesties, matome, kad teisinga sintaksė gali būti:

 $ ls -ld /tmp /tnt >/dev/null 2>> 

šiam konkrečiam atvejui yra nuorodų sintaksė: > ... arba >>

 $ ls -ld /tmp /tnt  $ ls -ld /tmp /tnt >> 

Nota: jei egzistuoja 2>> , 1>> pat yra teisinga sintaksė:

 $ ls -ld /tmp /tnt 2>/dev/null 1>> 

4b- Dabar leisiu jums galvoti:

 $ ls -ld /tmp /tnt 2> 1> | sed -es/^/++/ ++/bin/ls: cannot access /tnt: No such file or directory ++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/ $ ls -ld /tmp /tnt 1> 2> | sed -es/^/++/ /bin/ls: cannot access /tnt: No such file or directory drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/ 

4c- Jei jus domina išsamesnė informacija

„Graceful“ vadovą galite perskaityti spustelėdami:

 man -Len -Pless\ +/^REDIRECTION bash 

konsolėje; )

228
29 апр. atsakymą pateikė F. Hauri 29 Bal 2013-04-29 19:33 '13, 19:33, 2013-04-29 19:33
  • 2 yra numatytasis stderr failo deskriptorius.
  • 1 yra numatytasis stdout failo deskriptorius.
  • >> yra korpuso sintaksė, skirta „sutraukti ankstesnį (pirmąjį) failo deskriptorių į kitą (antrąjį) failų deskriptorių“.
112
03 дек. Atsakymą pateikė Bill Karwin gruodžio 3 d. 2017-12-03 01:38 '17 ne 1:38 2017-12-03 01:38

Skaičiai nurodo failų aprašus (fd).

  • Null stdin
  • Vienas stdout
  • Du - stderr

2>> peradresuoja fd nuo 2 iki 1.

Tai veikia bet kokiam skaičiui failų aprašų, jei programa juos naudoja.

Galite pamiršti /usr/include/unistd.h jei pamiršote juos:

  #define STDIN_FILENO 0  #define STDOUT_FILENO 1  #define STDERR_FILENO 2  

Tačiau parašiau C įrankius, kuriuose nestandartinių rinkmenų rankenos pritaikytos registravimui, todėl nematote jos, nebent jį nukreipsite į failą ar kažką panašaus.

59
04 мая '09 в 1:58 2009-05-04 01:58 atsakė Colin Burnett'ui gegužės 04'09 at 1:58 2009-05-04 01:58

Ši konstrukcija siunčia standartinį klaidos srautą ( stderr ) į dabartinę standartinės išvesties vietą ( stdout ) - stdout valiutos problema, atrodo, buvo ignoruota kitų atsakymų.

Naudodami šį metodą galite nukreipti bet kurį išvesties deskriptorių į kitą, tačiau dažniausiai jis naudojamas stdout ir stderr srautams nukreipti į vieną srautą apdorojimui.

Keletas pavyzdžių:

 # Look for ERROR string in both stdout and stderr. foo 2> | grep ERROR # Run the less pager without stderr screwing up the output. foo 2> | less # Send stdout/err to file (with append) and terminal. foo 2> |tee /dev/tty >>outfile # Send stderr to normal location and stdout to file. foo >outfile1 2> >outfile2 

Atkreipkite dėmesį, kad šis paskutinis nebus outfile2 stderr į outfile2 - jis nukreipia jį į tai, kas buvo, kai argumentas buvo įvykdytas ( outfile1 ), o tada nukreipia stdout į outfile2 .

Tai leidžia naudoti gana sudėtingą sukčiavimą.

45
04 мая '09 в 2:54 2009-05-04 02:54 atsakymas pateikiamas paxdiablo 04 gegužės '09, 2:54 2009-05-04 02:54

Radau šį puikų įrašą peradresavimu: Viskas apie peradresavimą

Peradresuokite tiek standartinę, tiek standartinę klaidą į failą

$ komanda failas

Šioje vienoje eilutėje pateikta informacija naudoja operatorių, kad nukreiptų išvesties srautus - stdout ir stderr - iš komandos į failą. Tai yra „bash“ spartusis klavišas, kuriuo greitai galima nukreipti abu srautus į tą pačią vietą.

Taip failų deskriptoriaus lentelė atrodo, kai bash nukreipė abi temas: 2019

29 окт. Deen John atsakymas, pateiktas spalio 29 d 2016-10-29 16:04 '16, 16:04 pm 2016-10-29 16:04

2 - standartinė konsolės klaida.

1 - standartinė konsolės išvestis.

Tai standartinis „Unix“, „Windows“ taip pat seka „POSIX“. Pavyzdžiui. paleidžiant

 perl test.pl 2>> 

Standartinė klaida nukreipiama į standartinę išvestį, todėl jūs galite matyti abu rezultatus kartu.

 perl test.pl > debug.log 2>> 

Vykdant debug.log galite matyti visą produkciją, įskaitant klaidas.

 perl test.pl 1>out.log 2>err.log 

Tada standartinė išvestis patenka į out.log ir standartinę klaidą.

Aš siūlau jums pabandyti juos suprasti.

12
19 июля '13 в 6:23 2013-07-19 06:23 atsakymą pateikė Marcus Thornton, liepos 19 d., 13 val., 6:23, 2013-07-19 06:23

Norėdami atsakyti į jūsų klausimą: jis priima bet kokį klaidų išvestį (paprastai siunčiamas į stderr) ir jį įrašo į standartinę išvestį (stdout).

Tai naudinga, pavyzdžiui, „daugiau“, kai reikia ieškoti viso išėjimo. Kai kurios programos, pvz., Spausdinimo naudojimo informacija stderr.

Norėdami padėti jums prisiminti

  • 1 = standartinė išvestis (kur programos spausdina įprastą išvestį)
  • 2 = standartinė klaida (kur programų spausdinimo klaidos)

„2> 1“ tiesiog nurodo viską, kas siunčiama į stderr, vietoj stdout.

Taip pat rekomenduoju perskaityti šį įrašą, nukreipiant klaidas, kai ši problema yra išsamiai aptarta.

12
04 мая '09 в 2:24 2009-05-04 02:24 atsakymą davė Andrioid gegužės 04 d. , 09:24 2009-05-04 02:24

2>> yra POSIX apvalkalo konstrukcija. Toliau pateikiamas suskirstymas, simbolis naudojant tokeną:


2 : išvesties failo deskriptorius Standartinė klaida .

>> : Kopijuokite išvesties failo deskriptorių (parinktis Peradresuoti išvesties operatorių > ). Atsižvelgiant į [x]>> , failo deskriptorius, pažymėtas x yra išvesties failo deskriptoriaus y kopija.

1Standartinė išvestis “ rankena į išvesties failą.

2>> išraiška 2>> kopijuoja failo deskriptorių 1 į 2 vietą, todėl bet kuris išvestis, įrašyta į 2 („standartinė klaida“) vykdymo aplinkoje, patenka į tą patį failą, kuris buvo aprašytas 1 („standartinė išvestis“).


Daugiau paaiškinimų:

„File Descriptor“ : „unikalus sveikasis skaičius kiekvienam procesui, naudojamas atpažinti atvirą failą, kad galėtumėte pasiekti failus.“

Standartinis išėjimas / klaida . Žiūrėkite toliau pateiktą pastabą skilties dokumento peradresavimo skiltyje:

Atidaryti failai nurodomi dešimtainiais skaičiais, pradedant nuo nulio. Didžiausią įmanomą vertę lemia įgyvendinimas; vis dėlto, visi taikomieji veiksmai turi palaikyti bent 0–9 imtinai, kad jie būtų naudojami programoje. Šie numeriai vadinami „failų aprašais“. 0, 1 ir 2 reikšmės turi ypatingą reikšmę ir įprastą naudojimą, o kai kurios peradresavimo operacijos numato; jie vadinami standartiniu įėjimu, standartine išvestimi ir standartine paklaida. Paprastai programos įveda duomenis iš standartinės įvesties ir įrašo išvestį į standartinę išvestį. Klaidų pranešimus paprastai rašo standartinė klaida. Prieš nukreipimo operatorius gali būti nurodytas vienas ar daugiau skaitmenų (be tarpinių ženklų), kad būtų nurodytas failo deskriptoriaus numeris.

10
25 дек. atsakymas pateikiamas 25 d. 2016-12-25 09:43 '16 at 9:43 am 2016-12-25 09:43

Programuotojo požiūriu tai reiškia, kad:

 dup2(1, 2); 

Žr. Pagalbos puslapį .

Supratimas, kad 2>> yra kopija, taip pat paaiškina, kodėl ...

 command >file 2>> 

... ne tas pats, kaip ...

 command 2> >file 

Pirmasis išsiųs abu srautus į file , o antrasis - klaidas stdout , o įprastą išvestį į file .

8
03 дек. atsakymas pateikiamas 03 d. 2015-12-03 13:20 '15 val. 20 val. 2015-12-03 13:20

Žmonės visada prisimena paxdiablo apie dabartinio peradresavimo adreso vietą ... Svarbu .

Mano asmeninis 2>> operatoriaus mnemoninis žodis 2>> yra toks:

  • Pagalvokite > kaip 'and' arba 'add' reikšmę (simbolis yra ir ne?)
  • Taigi jis tampa: „peradresuoti 2 (stderr), kur 1 (stdout) jau yra / dabar ir pridedami abu srautai.

Tie patys mnemoniniai darbai taikomi kitam dažnai naudojamam peradresavimui, 1>> :

  • Pagalvokite > įvertinkite and arba) add ... (jūs gaunate idėją apie „amžius“, „kas?“)
  • Taigi jis tampa: „peradresuoti 1 (stdout), kur 2 (stderr) jau yra / ir dabar prideda abu srautus.

Ir visada prisiminkite: reikia perskaityti „iš galo“ peradresavimo grandines, iš dešinės į kairę ( ne iš kairės į dešinę).

4
01 июля '12 в 13:47 2012-07-01 13:47 atsakymą pateikė Kurt Pfeifle liepos 12 d., 12:47, 2012-07-01 13:47

Tai lygiai taip pat, kaip stdout arba terminalo klaida. t.y. cmd jokių komandų $ cmd 2> failo vardo katės failo pavadinimo komanda nerasta

Klaida išsiųsta į tokį failą kaip 2> 1 klaida, išsiųsta į terminalą

4
11 окт. atsakymas duotas Kalanidhi spalis 11 2013-10-11 09:16 '13, 9:16, 2013-10-11 09:16

Jei /foo jūsų sistemoje neegzistuoja ir /tmp ...

 $ ls -l /tmp /foo 

spausdina /tmp turinį ir išspausdina klaidos pranešimą /foo

 $ ls -l /tmp /foo > /dev/null 

siųsti /tmp turinį į /dev/null ir spausdinti klaidos pranešimą /foo

 $ ls -l /tmp /foo 1> /dev/null 

tai padarys ( 1 pastaba)

 $ ls -l /tmp /foo 2> /dev/null 

išspausdina /tmp turinį ir siunčia klaidos pranešimą /dev/null

 $ ls -l /tmp /foo 1> /dev/null 2> /dev/null 

išsiųs tiek įrašą, tiek klaidos pranešimą į /dev/null

 $ ls -l /tmp /foo > /dev/null 2> > 

yra santrumpa

2
01 сент. Atsakymas pateikiamas Matijs 01 sep . 2016-09-01 23:58 '16 at 23:58 pm 2016-09-01 23:58

Įvesties peradresavimas

Įvesties peradresavimas sukelia failą, kurio pavadinimas yra žodžio pratęsimo rezultatas, kuris turi būti atidarytas skaityti failų deskriptoriuje n arba standartiniame įvestyje (failo deskriptorius 0), jei n nenurodytas.

Bendras įvedimo nukreipimo formatas:

  [n]<word 

Išvesties peradresavimas

Peradresavimo išvestis sukelia failą, kurio pavadinimas kilęs iš žodžio plėtinio, kuris turi būti atidarytas rašant failo deskriptorių n arba standartinę išvestį (failo deskriptorius 1), jei n nenurodytas. Jei failas neegzistuoja, jis sukuriamas; jei jis egzistuoja, jis sutrumpinamas iki nulio dydžio.

Bendras išėjimo nukreipimo formatas:

  [n]>word 

Failų deskriptorių perkėlimas

Perkeliant failų deskriptorių peradresavimo operatorių

  [n]<> 

failo deskriptoriaus numerį perkelia į failo deskriptorių n arba standartinį įvestį (failo deskriptorius 0), jei n nenurodytas. skaitmuo uždaromas pasikartojant su n.

Panašiai ir peradresavimo operatorius

  [n]>> 

failo deskriptoriaus numerį perkelia į failo deskriptorių n arba standartinę išvestį (failo deskriptorius 1), jei n nenurodyta.

isy:

man bash
įveskite /^REDIRECT ir raskite redirection skyrių, sužinokite daugiau ..

Interneto versija čia:
http://www.gnu.org/software/bash/manual/bashref.html#Redirections

ps:

daug laiko, man buvo galingas Linux mokymosi įrankis

2
06 июня '15 в 14:07 2015-06-06 14:07 yurencheno atsakymas birželio 06 d. 15 d. 14:07 2015-06-06 14:07

0 įvesties, 1 stdout ir 2 - stderr.

Vienas patarimas : somecmd >1.txt 2>> yra teisingas ir somecmd 2> >1.txt visiškai neteisingas be jokio poveikio!

0
25 июля '16 в 12:46 2016-07-25 12:46 atsakymas pateikiamas Turtle liepos 25, 16 d. 12:46 2016-07-25 12:46

Kiti klausimai apie žymių arba Užduoti klausimą