"2> 1" qabıqda nə deməkdir?

Unix qabığında, stderrstdout daha da emal etmək üçün bir stdout axını ilə birləşdirmək istəyirsinizsə, stderr sonunda aşağıdakıları əlavə edə bilərsiniz:

 2>> 

Beləliklə, əgər mən g ++-dən çıxışda başdan istifadə etmək istəmirəmsə, bu kimi bir şey edə bilərəm:

 g++ lots_of_errors 2> | head 

Buna görə də ilk bir neçə səhvləri görürəm.

Bunu xatırlamaq mənim üçün hər zaman çətindir və mən daim onu ​​axtarmaq lazımdır və bu, əsasən, bu oyunun sintaksisini tam başa düşməmişəm. Birisi onu qırır və xarakterə görə "2> və 1" deməkdir?

1554
04 мая '09 в 1:57 2009-05-04 01:57 Tristan Havelick May 04 '09 'da 1:57' da soruşdu 2009-05-04 01:57
@ 16 cavab

Fayl təsviri 1 standart çıxış (stdout).
Fayl təsvirçisi 2 standart bir səhvdir (stderr).

Bu quruluşu xatırlamaq üçün bir yoldur (bu olduqca dəqiq olmadı baxmayaraq): əvvəlcə, 2>1 stdrr stdout-ə yönləndirmək üçün yaxşı bir yol kimi görünə bilər. Bununla belə, əslində "stderr 1 adlı faylya yönləndirmək" kimi şərh olunacaq. > sonrakı bir fayl adı deyil, faylın adıdır. Beləliklə, tikinti: 2>> olur.

1763
04 мая '09 в 2:04 2009-05-04 02:04 04 May '09 'da 2:04' də Ayman Hourie 'ye cavab verdi 2009-05-04 02:04
 echo test > afile.txt 

.. afile.txt ünvanına yönləndirir. Bunu etməklə eyni.

 echo test 1> afile.txt 

Stderr yönləndirmək üçün, siz ...

 echo test 2> afile.txt 

>> Bir stream başqa bir fayl descriptoruna yönəldilməsi üçün sintaksisidir - 0 stdin. 1 - standart çıxış. 2 - stderr.

border=0

Stdout'u stderr'a yönlendirerek yönlendirebilirsiniz ..

 echo test 1> # or echo test >> 

.. və ya əksinə:

 echo test 2>> 

Beləliklə, daha qısa .. 2> stderr (müəyyənləşdirilməmiş) bir faylya yönəldir, stdrr stdout

436
04 мая '09 в 1:59 2009-05-04 01:59 cavab 04 may '09 saat 01:59 'da verildi. 2009-05-04 01:59

Bəzi istiqamətləndirmə istiqamətləri

Bunun bir sıra sintaksis xüsusiyyətləri mühüm davranışa malik ola bilər. STDERR , STDOUT , STDOUT və arqumentləri sifariş etmək üçün bir neçə kiçik nümunə var.

1 - Üstün yaz və ya əlavə et?

> Simvolu yönləndirməni göstərir.

  • > tam bir faylın göndərilməsi deməkdir, əgər hədəf yenidən noclobber ( noclobber bash funksiyası # 3-də bax).
  • >> əgər varsa, göndərmə hədəfə əlavə olunacaq.

Hər halda, əgər mövcud deyilsə, fayl yaranacaq.

2 - Shell komanda xətti sifarişə asılıdır!

Bunu sınamaq üçün hər iki çıxışa bir şey göndərəcək sadə bir əmr lazımdır:

 $ 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 

(Əlbəttə ki, /tnt adlı bir qovluğun olmadığı gözlənilir;). Bəli, biz var!

Beləliklə, baxaq:

 $ 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 

STDERR son STDERR komanda satırı dökümü gözlənilən davranış kimi görünmür ... Amma ...

Bir çıxış, digər və ya hər ikisi haqqında mesajların bəzi filtrelemesini etmək istəyirsinizsə:

 $ 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 ---> 

Bu paraqrafdakı sonuncu əmr əvvəlki bənddə olduğu kimi eyni olduğuna diqqət yetirirəm; yazdığım yer gözlənilən davranış kimi görünmür (belə ki, gözlənilən davranış ola bilər).

Hər iki ouputda müxtəlif əməliyyatların aparılması üçün bir neçə redaksiya fəndləri var :

 $ ( 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: > təsnifatı spontan şəkildə baş verəcək ) 9>> .

Əlavə: nota! ( >4.0 ) yeni versiyası ilə, yeni bir xüsusiyyət və belə hərəkətləri yerinə yetirmək üçün daha cinsi sintaksis yarandı:

 $ 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 

Nəhayət bu cascading çıxış formatı üçün:

 $ ((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 

Əlavə: nota! Hər iki istiqamətdə eyni sintaksis:

 $ 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 

STDOUT xüsusi bir filtrdən, digər STDERR STDOUT keçir və nəhayət, hər iki çıxış, kombinasiya üçüncü komanda filtrindən keçir.

3 - noclobber və sintaksis haqqında bir söz

Yenidən yazma haqqında nədir:

set -o noclobber hər hansı bir faylın üzərində set -o noclobber üçün baş təlimat set -o noclobber , sözdizimi >| bu limitdən keçməyə imkan verir:

 $ 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 

Dosyanın hər dəfə üstündən yazılır:

 $ 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 

>| Da gedin :

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

Bu seçimi və / və ya zaten yüklü olduqda isteyin.

 $ 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 - Son hiylə və daha çox ...

Hər iki əmri bu əmrdən istiqamətləndirmək üçün doğru sintaksisin ola biləcəyini görürük:

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

bu xüsusi iş üçün bir qısa sintaksis var: > ... və ya >>

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

Nota: 2>> varsa, 1>> də düzgün sintaksisidir:

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

4b- İndi düşünürəm:

 $ 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- Daha ətraflı məlumat istəyirsinizsə

Güzəştli Kılavuzu oxuya bilərsiniz:

 man -Len -Pless\ +/^REDIRECTION bash 

konsolunda; )

228
29 апр. Cavab F. Hauri tərəfindən verilir 29 Apr 2013-04-29 19:33 '13 at 19:33 2013-04-29 19:33
  • 2 stderr üçün default fayl descriptorudur.
  • 1, stdout üçün default fayl descriptorudur.
  • >> "əvvəlki (birinci) fayl təsvirini növbəti (ikinci) fayl descriptoruna çökdürmək" üçün qobul sintaksisidir.
112
03 дек. Cavab 03 dekabrda Bill Karwin tərəfindən verilmişdir. 2017-12-03 01:38 '17 'də 1:38' də 2017-12-03 01:38 'də

Nömrələr fayl descriptorlarına (fd) istinad edir.

  • Null stdin
  • Bir stdout
  • İki - stderr

2>> fd 2-dən 1-ə istiqamətləndirir.

Proqram bu proqram istifadə edərsə, bu hər hansı bir fayl descriptor üçün çalışır.

Əgər onları /usr/include/unistd.h bilərsiniz:

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

Lakin, xüsusi günlüğe kaydetmek üçün qeyri-standart fayl tanıtıcıları kullanan C araçlarını yazdım, belə ki onu bir faylya və ya bir şeyə yönlendirmediğiniz sürece göremiyorsunuz.

59
04 мая '09 в 1:58 2009-05-04 01:58 Colin Burnett may 04'09 da 1:58 2009-05-04 01:58 cavab verdi

Bu stderr standart səhv stream ( stderr ) standart çıxışın ( stdout ) mövcud yerini göndərir - stdout problem valyutanın digər cavabları ilə nəzərə alınmırdı.

Bu metodu istifadə edərək, hər hansı bir çıxış descriptorunu digərinə yönəldə bilərsiniz, lakin tez-tez stdoutstderr axınlarını emal üçün bir axına yönəltmək üçün istifadə olunur.

Bəzi nümunələr:

 # 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 

Qeyd edək ki, sonuncu outfile2 yönəldilməyəcəyini outfile2 - bu arqument ( outfile1 ) ilə qarşılaşdıqda outfile1 və sonra outfile2 üçün outfile2 .

Bu, çox mürəkkəb fırıldaqçılıqdan istifadə etməyə imkan verir.

45
04 мая '09 в 2:54 2009-05-04 02:54 Cavab paxdiablo 04 May '09 da 2:54 2009-05-04 02:54 verilir

Yenidən yönləndirməsində bu parlaq məqamı tapdım: Yenidən yönəlmələr haqqında

Hər iki standart çıxış və standart səhv fayl üçün yönləndirin

$ command faylını seçin

Bu bir xətt bəyanatı, operatoru hər iki çıxış axını - stdout və stderr - komandan faylya yönləndirmək üçün istifadə edir. Bu, həm axınların həmin istiqamətə sürətlə yönləndirilməsi üçün bir bas düyməsidir.

Baş hər iki mövzuya yönəldikdən sonra fayl təsvirçisinin cədvəli necədir: 2019

29 окт. Deen John tərəfindən 29 Oktyabrda verilən cavab 2016-10-29 16:04 '16 saat 04:04 'da 2016-10-29 16:04

2 - standart konsol səhvi.

1 - standart konsol çıxış.

Bu, standart Unix, Windows da POSIX izləyir. Məsələn, başlanğıcda

 perl test.pl 2>> 

Standart xəta standart çıxışa yönəldilir, belə ki, həm çıxışları həm də birlikdə görə bilərsiniz.

 perl test.pl > debug.log 2>> 

İcra etdikdən sonra, səhvlər də daxil olmaqla, bütün çıxışları debug.log ünvanında görə bilərsiniz.

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

Sonra standart çıxış out.log və err.log-da standart səhv gedir.

Onları anlamağa çalışmanı təklif edirəm.

12
19 июля '13 в 6:23 2013-07-19 06:23 Cavab Marcus Thornton tərəfindən 19 İyul, '13 'də 6:23 2013-07-19 06:23' də verilir

Sualınıza cavab vermək üçün: hər hansı bir səhv çıxışı qəbul edir (adətən stderrə göndərilir) və standart çıxışa (stdout) yazır.

Bu, bütün çıxışı üçün pagingə ehtiyac duyduğunuzda, məsələn, "daha çox" faydalıdır. Bəzi proqramlar, məsələn, stderrdə istifadə məlumatlarının çap edilməsi.

Xatırlamaq üçün

  • 1 = standart çıxış (proqramların normal çıxdıqda)
  • 2 = standart səhv (proqram çap səhvləri olduğu yerlərdə)

"2> 1" stdout yerinə stderr göndərilən hər şeyi göstərir.

Mən də bu məsələni ətraflı şəkildə əhatə etdiyində səhvləri yönləndirərkən oxumağı məsləhət görürəm.

12
04 мая '09 в 2:24 2009-05-04 02:24 cavab 04 may 09-da Andrioid tərəfindən 2:24 2009-05-04 02:24 tarixində verilir

2>> POSIX qabığının quruluşudur. İşarələmə, token istifadə edərək mö'cüzə:


2 : çıxış faylının təsviri.

>> : Çıxış faylının təsviri ( redirect çıxış operatoru > seçimi) ilə çoğaldırın . [x]>> verildiyində, x göstərilən fayl təsvirçisi çıxış faylının təsviri y nin bir surəti hazırlanır.

1 " Standart çıxış " çıxış faylına aiddir.

İfadə 2>> nüsxə fayl təsvirini 1 ə yerə göndərin, beləliklə, iş şəraitində 2 ("standart səhv") yazılan hər hansı bir çıxış ilk olaraq təsvir edilən 1 ("standart çıxış") faylda olur.


Əlavə məlumat:

Fayl Dəstəkləyicisi : "Fayllara giriş məqsədi üçün açıq faylları müəyyən etmək üçün istifadə olunan hər bir proses üçün unikal bir tamsayıdır."

Standart çıxış / səhv . Shell sənədlərinin Redirection bölməsində aşağıdakı qeydlərə baxın:

Açılmış fayllar sıfırdan başlayaraq, onlu rəqəmlərlə təmsil olunur. Ən böyük mümkün dəyər tətbiq edilərək müəyyənləşdirilir; Ancaq bütün tətbiqlər tətbiqdə istifadə üçün ən azı 0'dan 9'a qədər dəstək verməlidir. Bu nömrələr "fayl təsvirçiləri" adlanır. 0, 1 və 2 dəyərləri xüsusi bir məna və normal istifadə edir və bəzi redaksiya əməliyyatları ilə nəzərdə tutulur; standart giriş, standart çıxış və standart səhv adlanır. Ümumiyyətlə, proqramlar standart girişdən daxil olur və çıxışları standart çıxışa yazır. Hata mesajları genellikle standart hatalarla yazılır. Yeniden yönlendirme operatorları, fayl tanımlayıcının numarasını belirtmek üçün bir və ya daha çox basamakla (ara karakterler olmadan) önceden bilər.

10
25 дек. cavab 25 dekabrda verilir . 2016-12-25 09:43 '16 saat 09:43 'da 2016-12-25 09:43

Proqramçı baxımından, bu tam olaraq deməkdir:

 dup2(1, 2); 

Kömək səhifəsinə baxın .

2>> də bir nüsxə olduğunu başa düşdükdə də ...

 command >file 2>> 

... eyni deyil ...

 command 2> >file 

Birincisi file həm axınları göndərir, həm də səhvləri səhvləri stdoutfile adi olaraq göndərir.

8
03 дек. cavab 03 dekabrda verilir . 2015-12-03 13:20 '15 saat 13:20 'de

İnsanlar həmişə cari redirect ünvanının yeri haqqında paxdiablo yadda ... Mühüm .

2>> operatoru üçün şəxsi mnemonicim aşağıdakılardır:

  • 'and' və ya 'add' (xarakter ampers- deyil) mənasını düşünün.
  • Beləliklə, olur: ' 2 (stdrr) redirect, burada 1 (stdout) artıq / hazırda və həm axınları əlavə edir .

Digər tez-tez istifadə olunan bir istiqamətləndirmə üçün eyni mnemonik işlər, 1>> :

  • Düşün > dəyər and ya add ... (bir ampersand fikri var, huh?)
  • Beləliklə, olur: ' 1 (stdout), 2 (stderr) artıq / hazırda olduğu və hər ikisini də əlavə edin .

Və həmişə xatırlayın: sağdan sola (soldan sağa doğru), "sondan" yenidən yönləndirmə zəncirlərini oxumaq lazımdır.

4
01 июля '12 в 13:47 2012-07-01 13:47 Cavab Kurt Pfeifle tərəfindən verilib 01 iyul '13 saat 13:47 'da 2012-07-01 13:47

Bu, stdout və ya terminal üçün saxta səhv kimi eyni. yəni, cmd heç bir komanda $ cmd 2> filename cat filename əmri tapılmadı

Terminalə göndərilən bu 2> 1 səhvinə bir fayla göndərilən səhv

4
11 окт. Cavab verilən Kalanidhi 11 oktyabr 2013-10-11 09:16 '13 'da 9:16' da 2013-10-11 09:16

Sisteminizdə /foo mövcud deyilsə və /tmp edirsə ...

 $ ls -l /tmp /foo 

/tmp içeriğini /tmp/foo üçün bir səhv baş beledir

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

/tmp içeriğini /dev/null /tmp göndərin və /foo üçün bir səhv /foo yazdırın

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

eyni şeyi edəcəyik (not 1 )

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

/tmp içeriğini /tmp ve /dev/null bir səhv /tmp gönderir

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

həm də siyahı və səhv mesajını /dev/null a göndərir

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

kısaltmasıdır

2
01 сент. Cavab verilir Matijs 01 sep . 2016-09-01 23:58 '16 'da saat 11:58 ' də 2016-09-01 23:58

Giriş redirection

Giriş redirection, isminin bir söz uzantısının sonucu olduğu bir dosyaya neden olursa, n belirtilmemişse, bir fayl tanımlayıcısı ya da standart girdi (fayl tanımlayıcısı 0) içinde açılması lazımdır.

Girişi yenidən yönləndirmək üçün ümumi format:

  [n]<word 

Çıxış redirectction

Nəzarət çıxışı, adının adı müəyyən edilmədiyi təqdirdə, bir fayl təsvirçisi n və ya standart çıxış (fayl təsvirçisi 1) yazmaq üçün açılması lazım olan bir söz uzantısından çıxardığı bir faylya səbəb olur. Fayl yoxdursa, yaradılır; əgər varsa, sıfır ölçüsü kəsilir.

Çıxış yönlendirme üçün ümumi format:

  [n]>word 

Fayl Tanımlayıcılarının Taşınması

Fayl Tanımlayıcıları Yenidən Yönləndirmə Operatoru

  [n]<> 

n müəyyən edilmədiyi təqdirdə fayl descriptor nömrəsini descriptor n və ya standart girişi (fayl təsvirçisi 0) daşıyır. rəqəm n ilə çoğaltıldıqdan sonra bağlanır.

Eynilə, yönlendirme operatoru

  [n]>> 

n müəyyən edilmədiyi təqdirdə, fayl təsvir nömrəsini descriptor n və ya standart çıxış (fayl təsvirçisi 1) faylına daşıyır.

isy:

man bash
redirection bölməsini tapmaq üçün, /^REDIRECT daxil edin, ətraflı məlumat əldə edin.

Onlayn versiya buradadır:
http://www.gnu.org/software/bash/manual/bashref.html#Redirections

ps:

çox vaxt man , Linux öyrənmək üçün güclü bir vasitə idi

2
06 июня '15 в 14:07 2015-06-06 14:07 Cavab yurenchen tərəfindən 06.06.2014 tarixində saat 14:07 'da verildi

Giriş üçün 0, stdout üçün 1 və stderr üçün 2.

Bir ipucu : somecmd >1.txt 2>> doğru və somecmd 2> >1.txt heç bir təsiri olmadan tamamilə səhvdir !

0
25 июля '16 в 12:46 2016-07-25 12:46 cavab Turtle iyul 25, '16 saat 12:46 2016-07-25 12:46 verilir