Başta ne zaman kullanılır () vs. {}?

60

Bash ile kabuk komut dosyası çalışıyorum ve (...) ile {...} arasındaki farkı bilmem gerekiyor. Bir komut yazarken ikisi arasında nasıl seçim yapılır?

    
sordu Fat Mind 07.04.2015 16:22

4 cevap

79

Komut listesinin yan etkilerinin geçerli kabuğunuzu etkilemesini istiyorsanız, {...}
kullanın Herhangi bir yan etkiyi silmek istiyorsanız, (...)

kullanın.

Örneğin, eğer ben bir alt kabuk kullanabilirim:

  • birkaç komut için $IFS değerini değiştirmek istiyorum, ancak mevcut kabuk için $IFS global değiştirmek istemiyorum
  • Bir yerde cd , ancak mevcut kabuk için $PWD değerini değiştirmek istemiyorum

Parantezlerin bir işlev tanımında kullanılabileceğine dikkat etmek gerekir:

  • normal kullanım: parantez: işlev gövdesi geçerli kabukta yürütülür; işlev tamamlandıktan sonra yan etkiler kalır

    $ count_tmp() { cd /tmp; files=(*); echo "${#files[@]}"; }
    $ pwd; count_tmp; pwd
    /home/jackman
    11
    /tmp
    $ echo "${#files[@]}"
    11    
    
  • olağandışı kullanım: parantezler: işlev gövdesi bir alt kabukta yürütülür; subshell çıkarıldığında yan etkiler kaybolur

    $ cd ; unset files
    $ count_tmp() (cd /tmp; files=(*); echo "${#files[@]}")
    $ pwd; count_tmp; pwd
    /home/jackman
    11
    /home/jackman
    $ echo "${#files[@]}"
    0
    

Belgeler

    
verilen cevap glenn jackman 07.04.2015 16:40
21

Resmi bash dokümantasyonundan :

  

()

     
( list )
         

Parantezler arasında bir komut listesi yerleştirmek, bir alt kabuk ortamının oluşturulmasına ve listedeki komutların her birinin bu alt kabukta yürütülmesine neden olur. Liste bir alt kabukta yürütüldüğünden, alt-ödev tamamlandıktan sonra değişken atamalar yürürlükte kalmaz.

  
     

{}

     
{ list; }
         

Küme parantezleri arasında bir komut listesi koymak, listenin geçerli kabuk bağlamında yürütülmesine neden olur. Hiçbir alt kabuk oluşturulmaz. Aşağıdaki listeden noktalı virgül (veya satırsonu) gereklidir.

  
    
verilen cevap Digital Trauma 07.04.2015 21:45
9

'{}' içindeki kod geçerli iş parçacığı / işlem / ortam içinde yürütülür ve değişiklikler daha kısa bir sürede kaydedilmek için kod geçerli kapsamda çalışır. '()' Deki kod, yürütme sonrasında atılan ayrı bir çocuk bash sürecindedir. Bu çocuk işlemi genellikle bir alt kabuk ve yeni, çocuksu bir alan olarak düşünülebilir.

Örnek olarak aşağıdakileri göz önünde bulundurun ...

 ~ # { test_var=test }
 ~ # echo $test_var
 test
 ~ # ( test_var2=test2 )
 ~ # echo $test_var2

 ~ # 

İlk örnekte '{}' ile uyarı, '' kapanıştan sonra bile yine de ayarlanır '},' '()' ile örnekte ise değişken '()' kapsamı dışında değildir.

    
verilen cevap smokes2345 07.04.2015 18:53
4

(...) , bir alt kabukta kod çalıştırmak için kullanılır. Kullanılan kod {...} 'si bir alt kabukta kullanılmayacaktır.

    
verilen cevap Antoine Orsoni 07.04.2015 16:27

Etiketlerdeki diğer soruları oku