“3> & 1 1> & 2 2> & 3” bir komut dosyasında ne yapar?


Yanıtlar:


77

Sayılar dosya tanımlayıcılarıdır ve yalnızca ilk üçünün (sıfırdan başlayarak) standart bir anlamı vardır:

0 - stdin
1 - stdout
2 - stderr

Yani emrinizde bu numaraların her biri bir dosya tanımlayıcısına işaret ediyor. Bir dosya tanımlayıcısını bir dosyaya sahip bir dosyaya >yönlendirebilir veya başka bir dosya tanımlayıcısına yeniden yönlendirebilirsiniz.>&

3>&1Komut satırında bir dosya tanıtıcı oluşturmak ve onu yönlendirme yapacağı 1olduğu STDOUT. Şimdi 1>&2dosya tanımlayıcısını 1'e yönlendirir STDERRve olan 2>&3dosya tanımlayıcısını 2'den 3'e yönlendirir STDOUT.

Yani temelde değiştirdiniz STDOUTve STDERRbunlar şu şekilde:

  1. Yeni bir fd 3 oluşturun ve fd'ye yönlendirin 1
  2. Dosya tanımlayıcı 1'i dosya tanımlayıcı 2'ye yönlendirin. Eğer dosya tanımlayıcıyı 3'e kaydetmediysek hedefi kaybederiz.
  3. Dosya tanımlayıcı 2'yi dosya tanımlayıcı 3'e yönlendirin. Şimdi dosya tanımlayıcıları bir ve iki değiştirilir.

Şimdi, program dosya tanımlayıcısına 1 bir şeyler yazdırırsa, dosya tanımlayıcısına 2 yazdırılır ve bunun tersi de geçerlidir.


"Komut satırınızdaki 3> & 1 yeni bir dosya tanımlayıcısı yaratacak ve onu STDOUT olan 1'e yönlendirecek" dedin. Fakat 1, STDIN anlamına gelmiyor mu?
sofs1

19

Değişiyor stdoutve stderr.

>nameçıktıyı dosyaya yönlendirmek anlamına gelir name.

>&numberçıktıyı dosya tanımlayıcısına yönlendirmek anlamına gelir number.

Bu nedenle, &kabuğa bir dosya tanıtıcısı demek istediğinizi söylemelisiniz, dosya adı değil.

Bir dosya tanıtıcısı, zaten açık bir dosyayı ifade eden bir sayıdır. Standart olanlar 0standart girdi 1için, standart çıktı için veya 2standart hata içindir. Ayrıca, yeni bir değişken oluşturduğunuzdaki gibi, yeni bir dosya tanımlayıcısı oluşturacak başka bir numara da kullanabilirsiniz var=value.

Varsayılan olarak, hem dosya tanımlayıcı olarak 1ve 2gidin /dev/tty, böylece koşarsan somecommand 3>&1 1>&2 2>&3yeni kabuğunda, bu (şimdi bir dosya tanıtıcı 3 var hariç) herhangi bir şey değiştirmez.

Ancak komut dosyasında daha önce bir yerde exec (eg exec 2>error.log) kullanarak bir yeniden yönlendirme yaparsa veya komut dosyası, yeniden yönlendirme (eg ./thescript 2>error.log) içeren bir komut satırıyla çalıştırılırsa , stdout ve stderr takas işlemi bir şey yapacaktır.

Özel bir durumda, stdout ve stderr komutunu değiştiren komut şudur dialog. Adam sayfasına bakarken görüyorum.

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

belki senaryoyu yazan kişi istediği dialog'ın çıkış gitmek stdoutyerine stderrnedense.

Ayrıca bkz : Yönlendirme sırası


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.