Bir dosya tanıtıcısını kapatma,> & - vs <& -


49

Ben bash eğitiminde okuyorum, diyor ki okumak için bir dosya tanıtıcısı açarsanız, yani

exec 3< echolist

O zaman böyle kapatmalısın,

exec 3<&-

Ancak, yazmak için bir dosya tanıtıcısını açarsanız, şöyle kapatılması gerekir:

exec 3>&-

Yine de internete baktığımda, insanların dosyaları açtıklarını ve bunları şu şekilde kapattıklarını görüyorum:

exec 3>&- 

NOT: öğreticiye göre, kullanmaları gerektiğinde exec 3<&1.

Öyleyse sorum şu, tüm dosya tanımlayıcıları exec n>&-n dosya tanımlayıcı numarası olan yerden kapatılabilir mi? Ne olursa olsun okumak, yazmak veya her ikisi için de açılmış mı?


21
Arasındaki tek fark >&-ve <&-(belirtilmemiş varsayılan fd olduğu >&-olduğu 1>&-süre <&-almaktadır 0<&-). Aynı x>&yolan, x<&yne zaman xsağlanmadığı hariç aynıdır .
Stéphane Chazelas

Yanıtlar:


48

Her iki kullanarak dosya tanımlayıcısı kapatabilir <&-ve >&-, bashaynı şekilde iki sözdizimi ayrıştırmak olacaktır.

Dosya itibaren y.tab.c içinde bashkaynak kodu:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

2
Bu, <>dosya tanımlayıcılarında da kullanılabilir.
CMCDragonkai

1
Hayır bu mümkün değil, ama olduğu gibi 3>&-veya 3<&-tanımlayıcısı kapatmak için görünür.
CMCDragonkai

1
Bu kapanış <>aynı şekilde yapılabilir.
CMCDragonkai

1
Ne demek istediğini anlamadım. Bir example./ verin
cuonglm

1
Öyle demek istediğimi sanmıyorum. Sadece bir aa okuma yazma dosya tanıtıcısı 3> & - ve 3 <& - kullanılarak da kapatılabilir.
CMCDragonkai

15

Bildiğim kadarıyla bkz gibi exec 3>&-ve exec 3<&-ne olursa olsun o açıldığı nasıl, aynı ve herhangi bir dosya tanımlayıcı üzerinde kullanılabilir. Shell Komut Dilinin POSIX tanımının 2.7.6 ve 2.7.5 bölümlerine göre :

2.7.5 Bir Giriş Dosyası Tanımlayıcısının Çoğaltılması

Yönlendirme operatörü:

[N] <& kelime

[... SNIP ...]

Sözcük '-' olarak değerlendirilirse, dosya tanımlayıcısı n veya n belirtilmezse standart girdi kapatılır. Açık olmayan bir dosya tanımlayıcısını kapatma girişimleri bir hata oluşturmayacaktır. Eğer kelime başka bir şeye değerlendirirse, davranış belirtilmez.

2.7.6 Bir Çıktı Dosya Tanımlayıcısının Çoğaltılması

Yönlendirme operatörü:

[N]> ve kelime

[... SNIP ...]

Sözcük '-' olarak değerlendirilirse, dosya tanımlayıcısı n veya n belirtilmezse standart çıktı kapatılır. Açık olmayan bir dosya tanımlayıcısını kapatma girişimleri bir hata oluşturmayacaktır. Eğer kelime başka bir şeye değerlendirirse, davranış belirtilmez.

Unutmayın ki, dosya tanıtıcısının n orijinal olarak nasıl açıldığı hakkında hiçbir şey belirtmediğine dikkat edin. Bu, close (2) dosyasının dosyayı nasıl açtığınızla ilgilenmediği gerçeğiyle aynı doğrultudadır .

Aşağıdakilerin hızlı bir şekilde engellenmesi:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

Buna karşı:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

Her iki durumda da Bash'in aynı şeyi yaptığını gösteriyor.

İki Hafif İlginç Gerçek


1
Bash man sayfası kapanmadan bahseder, linkinizi belirtir: Eğer kelime '-' olarak değerlendirilirse, dosya tanımlayıcısı n kapanır.
studog

@studog Kaynağı kontrol ettiğiniz için teşekkür ederiz! Ben burada olanlar Bash 3 için yerel man sayfasına bakarak ve ardından, kapanış hakkında ifade açıklaması unutulmuş eski Bash 3 belgelerinde Bash 4. içindi online belgeler, bağlantılıydı olduğunu düşünüyorum [N]>&WORD: budala .savannah.gnu.org / cgit / bash.git / ağaç / doc /…
Steven D

7

Cuonglm'nin bir '<>' FD'yi kapatma anlayışı için bir örnek.

Bu, http://tldp.org/LDP/abs/html/io-redirection.html adresindeki Advanced Bash-Scripting Guide'dan alıntılanmıştır.

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.
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.