&> Ve 2> & 1 arasındaki farklar nedir


30

Yönlendirmenin iki biçimi vardır standart çıktı ve standart hata içine standart çıktı . Ama hangisi daha iyi? ve neden &>mükemmel olarak kabul edilir?

Farkların ne olduğunu bulamıyorum, bu yüzden birçok öğretici ve hatta bash manuel durumu &>daha iyi!

Ben kullanacaktır Neden Yani &>değil2>&1

Temelde bashkabuk kullanarak


EDIT: Yorumcular için teşekkürler

Sadece> & csh veya tcsh ile çalışır

Ksh sadece 2> & 1 çalışır.

tire kullanımı> sadece dosya 2> & 1 sadece yönlendirme

Daha sonra, senaryomu kullanmak için hangisi kullanılırsa kullanılsın, kullanılan kabuklar ne olursa olsun diğer sistemlerle uyumludur!


daha iyisi yapmanız gerekenleri yapar. bunlar çok farklı şeyler yapar. hangi kabuğu kullanıyorsun
Skaperen

@Skaperen bash kullanarak
Maythux

1
ne yapacaksın sen başarmak istiyorsunuz?
Skaperen

Sadece farklılıkların ne olduğunu bilmek istiyorum, İstediğim şey ikisinde de değil ama sadece bir fark olup olmadığını bilmem gerekiyor, böylece bir zamanlar diğerine tercih edilir
Maythux

2
&> somewhereşunun için kısaltılmış kısaltmadır > somewhere 2>&1: bash el kitabının sözleriyle, bunlar "symantically denktir"
steeldriver 11:15

Yanıtlar:


23

Bash'in man sayfası, stderr ve stdout'u yönlendirmenin iki yolu olduğunu belirtir : &> file ve >& file. Şimdi, hem stderr hem de stdout yazdığına dikkat edin.

Bu durumda >file 2>&1stdout (1) 'in dosyaya yönlendirmesini yapıyoruz, fakat aynı zamanda stderr'e (2) stdout ile aynı yere yönlendirilmesini söylüyorum! Yani amaç aynı olabilir, ama fikir biraz farklı. Diğer bir deyişle "John, okula git; Suzzie, John'un gittiği yere git".

Tercih ne olacak? &>bir bashşey. Yani bir senaryo taşıyorsanız, bu işe yaramaz. Ancak,% 100’ünüzün komut dosyanızın yalnızca bash içeren sistemde çalışacağından eminseniz - tercih yoktur

İşte dash, Ubuntu'nun varsayılanı olan Debian Amquist Shell'in bir örneği .

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

Gördüğünüz gibi stderr yönlendirilmiyor

Söz konusu düzenlemelerinizi ele almak için, $ SHELL değişkenini kontrol etmek ve yönlendirmeleri buna göre değiştirmek için if ifadesini kullanabilirsiniz.

Ancak çoğu durumda > file 2>&1işe yaramalı


Daha teknik terimlerle, forma Çoğaltıcı Çıktı Dosya Tanımlayıcısı[integer]>&word adı verilir ve POSIX uyumlu ve Brourne benzeri kabukların çoğu tarafından desteklenen POSIX Kabuk Komut Dili standardı tarafından belirtilen bir özelliktir.

Ayrıca bkz . Çıktı yönlendirmelerinde tam olarak ne anlama geliyor?


O zaman diğer kabukları kullanırken ne olur?
Maythux

zsh destekler &>desteklemez .... @Maythux In kabukları &>örneğin dashsize önemsiz kullanmak gerekir >file 2>&1yönlendirmeyi ..
heemayl

Sonra
senaryomun

3
@Maythux Kullanımı >file 2>&1. Tüm kabukları üzerinde Bu çalışma
Sergiy Kolodyazhnyy

1
@ /etc/passwdHer kullanıcı için ayarlanan TSJNachos117 mermileri etkileşimli mermilerdir. Sistem komut dosyaları genellikle dash aksi belirtilmedikçe içindir. Neyin varsayılan olduğuna gelince, bu /bin/shUbuntu'nun durumunda olana neyin bağlandığı ile belirlenir dash. RHEL’de bash, FreeBSD’de tcsh kaynak ve başka bir kaynak
Sergiy Kolodyazhnyy

6

Bourne-again SHELL'in işleri yapma şeklini takip etmeyi genel olarak tavsiye ederim , çünkü bash tartışmasız en popüler Unix kabuğu. Bash tipik olarak ya &>da kullanır 2>&1. IMHO, ikisi de "mükemmel" değil, bu yüzden bu saçmalığı unutmayı tavsiye ederim. Gerçekçi olarak, hangisini kullanmanız gerektiği, ne yapmaya çalıştığınıza bağlıdır.

2>&1stderr komutunu stdout ile birleştirir; örneğin, stderr metnini yayınlamak istediğinizde yararlı olabilir. Örneğin, bir programın belirli bir stderr mesajı yazdırıp yazdırmadığını görmek, ancak ekranınızın (muhtemelen) önemsiz çöplerle dolmasını istemiyorsanız program 2>&1 | grep crashed, bir programdan stdout ve stderr'yi arayacak şekilde bir şey yapabilirsiniz. "çöktü" sözcüğü için "program" denir.

Öte yandan, bir programın herhangi bir şey yazdırmasını istemiyorsanız, basit bir şekilde çalışabilirsiniz program &> /dev/null; bu, stderr ve stdout komutlarını / dev / null komutuna yönlendirir, işleri sihirli bir şekilde ortadan kaldıran özel bir dosyadır. Ya da bir programın çıktısını kaydetmek istiyorsanız (belki de bir hatayı bildirmek için), hem stderr hem de stdout'u bir dosyaya program &> log.txtyönlendirebilirsiniz: tüm verileri "log.txt" adlı bir dosyaya yönlendirir. İsterseniz, stdout ve stderr komutunu , her ikisinin de kullanımıyla aynı etkiye sahip olacak şekilde program 2> log.txt > log.txtveya aracılığıyla yönlendirebilirsiniz . Eğer böyle bir şey yaparsanız , sadece stdout yönlendirilecek, ancak stderr yukarıda gösterildiği gibi yönlendirilebilecek olan kedi gibi başka bir programa yönlendirilebilir. Ancak yazarakprogram 2>&1 | cat > log.txt&>program 2>&1 > file&>daha az karakter yazmayı içerdiğinden (ve insanların okuması biraz daha kolaydır), yukarıdaki örneklerin hepsinden daha kolaydır. program 2> log.txt > log.txtBash olmayan mermilerde daha fazla çalışabileceğini unutmayın .

Not: Diğer mermileri kullanan insanlar için endişeleniyorsanız, betiğinizin ilk satırına "sihirli sayı" veya "shebang" olarak ekleyebileceğiniz bir şey var. Bu aslında diğer bilgisayarların (özellikle Unix benzeri işletim sistemlerini çalıştıranların) bir komut dosyasını çalıştırmak için hangi programı kullanacaklarını bildiğinden emin olmanın bir yoludur. Farklı scriptler farklı shebanglar kullanır. Bir bash betiği için bir shebang şuna benzer:

#!/bin/bash

Yukarıdakileri belirli bir komut dosyasının ilk satırı olarak kullanırsanız, bash genellikle söz konusu komut dosyasını çalıştırmak için kullanılır. Bu, birisinin komut dosyasını yanlış kabukla yanlışlıkla çalıştırmasını zorlaştıracaktır.

Not: Yalan söylemeyeceğim: şimdiye kadar, birinin kullanabileceğini bilmiyordum >&, ama bash kadarıyla aynı şekilde görünüyor &>. Her gün yeni bir şey öğreniyorsun.


#!Açıkça istemek için hattın kullanımı konusunda hemfikir olsanız bashda, diğer sistemlerde her zaman kullanılamaz. Çoğu zaman geliştiriciler / sistem yöneticileri, kullanılamayan sistemler için taşınabilir komut dosyaları yazmak bashzorunda kalırlar ve kurulumları kendi kontrolleri altında olmayabilirler bash. Bu >file 2>&1sadece çok taşınabilir.
Sergiy Kolodyazhnyy

Hak talebinde bulunduğunuz veya istediğiniz sonucu vermeyen bir ters hata yaptınız. Stderr'yi stdout'a yönlendirin, ardından stdout'u orijinal stdout'ta stderr bırakır.
ubfan1

Serg: Bash'in evrensel olduğunu ima etmek istemedim. Ancak, bence (t) csh den daha fazla insan kullanıyor. Başka birinin ne kullandığını bilmiyorsanız ve kör bir tahminde bulunmanız gerekiyorsa, bash muhtemelen en iyi bahistir. Ayrıca, taşınabilirlik hakkında genel olarak bilgim yok çünkü yalnızca bash kullanıyorum. >file 2>&1Daha taşınabilir olduğu gerçeğini bilmek iyidir. Bunu yansıtmak için bir düzenleme yapacağım.
TSJNachos117

Ubfan1, bilgi için teşekkürler. Milyonlarca yılda bash'ın stderr'i bu durumda bir dosyaya yönlendirmeyeceğini asla tahmin edemezdim. Başkalarının da aynı hatayı yapmasını engellemek için cevabımı yeni düzenlemedim.
TSJNachos117

4

Gönderen Bash Reference Manual -> 3.6.4 Yönlendirme Standart Çıktı ve Standart Hata :

Bu yapı, hem standart çıktının (dosya tanımlayıcısı 1) hem de standart hata çıktısının (dosya tanımlayıcısı 2), kelimenin kelimenin genişlemesi olduğu dosyaya yönlendirilmesini sağlar.

Standart çıktıyı ve standart hatayı yönlendirmek için iki biçim vardır:

&>word

ve

>&word

İki formdan ilki tercih edilir. Bu anlamsal olarak eşdeğerdir.

>word 2>&1

İkinci formu kullanırken, kelime bir sayıya veya '-' ye kadar genişlemeyebilir. Varsa, diğer yönlendirme işleçleri uyumluluk nedenleriyle başvuruda bulunurlar (aşağıdaki Dosya Tanımlayıcılarını Çoğaltma'ya bakın).

Greg'in Giriş ve Çıkış konusundaki wiki'sine de bakınız -> 4.2. Dosya Tanımlayıcı Manipülasyonu :

Kolaylık sağlamak için Bash, size başka bir yönlendirme yöntemi daha sunar. &> Yönlendirme operatörü aslında burada yaptığımızın daha kısa bir versiyonudur [ 2>&1]; stdout ve stderr dosyalarının her ikisine de yönlendirilmesi.


4

Öyleyse neden kullanmalıyım>> 2> & 1

2>&1 standart Bourne / POSIX kabuğudur.

&>Bir bash uzantısı ve değil de jure standardı.

Bash uzantılarını kullanarak komut dosyaları yazarsanız, er ya da geç, standart bir kabukta çalıştıkları için kriptik sözdizimi hata mesajlarıyla başa çıkma hatalarıyla karşılaşırsınız.

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.