`>> / dev / stderr` (beyaz boşluklu) ve`> & 2` arasındaki fark nedir?


11

Bash.

Ne kullanmam gerektiğini belirlemekte zorluk çekiyorum?

tüm komut dosyalarım ">> / dev / stderr" kullanıyor

bash isteminde, eğer denersem:
echo test >>/dev/stderrworks
echo test >> /dev/stderrworks
echo test >/dev/stderrworks
echo test > /dev/stderrworks

echo test >>&2BAŞARISIZ!
echo test >> &2BAŞARISIZ!
echo test >&2çalışır
echo test > &2FAILS!

Tüm senaryolarımı değiştirmek istiyorum >&2.

Ayrıca ssh (sonra su SomeUser) üzerinde >>/dev/stderrhiç çalışmaz (izin reddedildi), sadece >&2işe yarayacak üzerinde büyük bir etkisi var gibi görünüyor .


ssh hatasının bir örneğini gösterebilir misiniz? Onu çoğaltamıyorum.
Jeff Schaller

@JeffSchaller haklısın, ancak bundan sonra susorun olur, soruyu güncelledi
Aquarius Power

@AquariusPower, ... bu arada tutarsızlığın açıklanması için: su -c 'some command'bu komutla /bin/shdeğil bash, bash'a özgü davranışların ( /dev/stderrmevcut olmadığında yeniden yönlendirme amacıyla simüle etme gibi ) çalıştırıldığı garanti edilmez.
Charles Duffy

Yanıtlar:


22

>& ndosya tanımlayıcısını doğrudan çoğaltmak için kabuk sözdizimidir . Dosya tanımlayıcı 2 stderr'dir; bu böyle çalışır. Sadece stderr'i değil, diğer dosya tanımlayıcılarını da çoğaltabilirsiniz. Burada dosya ekleme modunu kullanamazsınız çünkü bir dosya tanımlayıcısını çoğaltmak asla kesilmez (stderr'niz bir dosya olsa bile) ve >&bir jetondur, bu yüzden içine boşluk koyamazsınız - ancak >& 2çalışır.

>> nameizin verilen farklı bir sözdizimidir; burada namedosya adı (ve simge >>). Bu durumda, /dev/stderrişletim sistemine özgü işlemle (Linux'ta bunun bir sembol bağlantısıdır /proc/self/fd/2) aynı zamanda standart hata anlamına gelen dosya adını kullanırsınız . Stderr bir terminal olduğunda, hem ekleme hem de kesme modu aynı şeyi yapar, çünkü bu kesilemez. Standart hata dosyası ise, ancak edecektir kısaltılabilir:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

/dev/stderrAşırı ssh ile ilgili bir hata görüyorsanız , sunucu yöneticisinin bu symlink'in çalışmasını önleyen bir güvenlik önlemi uygulamış olması mümkündür. (Örneğin, erişemezsiniz /procveya /dev). Her iki garip kırılmaya neden olmasını beklesem de, yinelenen dosya tanımlayıcı sözdizimini kullanmak mükemmel makul (ve muhtemelen biraz daha verimli) bir yaklaşımdır. Şahsen ben tercih ederim.


Daha önce sahip olduğum bu kesik sorunu çoğaltmaya çalışırken büyük bir sorun yaşıyordum (aksi takdirde bunu hehe'ye ekleyecektim), kullanmak >>için her şeyi değiştirdim , bunu belirtmek için thx! Ayrıca, su SomeUserssh ile bağlandıktan sonra bir adımı kaçırdım .
Kova Gücü

Bu bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/footho kesecek! 2>&1 |tee /tmp/foogiriş yapmak için mükemmel olanı (ve ile ) ve hepsini değiştirdikten sonra mükemmel bir şekilde çalışacaktır >&2. Bu yüzden sadece doğrudan dosya kullanımı /dev/stderr, çoğaltılmış tanımlayıcı değil, serin thx kesilmesine izin verir sanırım !
Kova Gücü

@AquariusPower doğru, yinelenen dosya tanımlayıcı asla kesilmez. Bu ilk paragrafta, belki bir şekilde vurgulamam gerekiyor?
derobert

gerekli değil, bazen yavaş yavaş ehehe
Kova Gücü

3
Bu cevap geliştirilebilir. > & bir jeton değil iki ve orada OP'nin kafa karışıklığı yatıyor.
Joshua

8

Başarısızlık durumları , yeniden yönlendirmelerde kullanılacak bash sözdiziminin& bir tekli belirtmesi >ve bunun doğrudan &işaretin yanında bulunmasını gerektirmesi nedeniyle oluşur :

[N]> ve kelime


2

Kullanım '>'yönlendirme için (eğer varsa kesikler) ya da '>>'(eğer varsa ekler).

'>&'Bir akışı çoğaltmak için kullanın , örneğin, aynı dosyada standart çıktı VE standart hata istiyorsanız, dosyaya yönlendirirsiniz '> output.log've ayrıca'2>&'

myjob.sh > output.log 2>&
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.