Bash'de alt fonksiyonlar olarak fonksiyonlar çalışıyor mu?


28

In Gelişmiş Bash-Komut Rehberi , içinde örnek 27-4 , alttan 7-inci satır, bu okudum:

Bir fonksiyon alt işlem olarak çalışır.

Bash'te bir test yaptım ve yukarıdaki ifadenin yanlış olduğu anlaşılıyor.

Bu sitede yapılan aramalar Bash Man ve arama motorum hiç ışık getirmiyor.

Cevabınız var mı ve açıklamak ister misiniz?


12
Belirtildiği gibi, bu kılavuz aşırı derecede yanıltıcıdır. Bunun yerine Wooledge Bash Kılavuzunu öneriyorum .
Joker

Yanıtlar:


36

Gelişmiş Bash-Komut Dosyası Kılavuzu her zaman güvenilir değildir ve örnek komut dosyaları, komut yerine kullanılan etkin bir şekilde kullanımdan kaldırılmış geri döndürme çubuklarını kullanma , örneğin, `command`yerine eski uygulamalar içerir $(command).

Bu özel durumda, kesinlikle yanlış.

(Kanonik) Bash kılavuzundaki Kabuk İşlevleri bölümü kesin olarak

Kabuk fonksiyonları mevcut kabuk bağlamında yürütülür; bunları yorumlamak için yeni bir süreç oluşturulmamıştır.


10
"Gelişmiş Bash-Script Kılavuzu genellikle güvenilmez" Çok doğru.
John1024

1
İlk cümlenizi desteklemek için referans verebilir misiniz?
Vousden

5
@ WillVousden bir referans burada neye benzerdi? Rehberin teknik eksikliklerinden bir grup örnek? Bash topluluğundaki uzmanların daha önce güvenilmez olduğuna dikkat çektiği bir belge? Bash'da altın renginde bir yığına sahip olan üye bir yorumda kabul ederse yardımcı olur mu? : p
kojiro

3
@ WillVousden İstediğiniz şeyin güvenilir bir biçimde olduğunu sanmıyorum. Mendel Cooper geçmişte rehberle ilgili sorunları güncellendi ve düzeltti, ancak halka açık bir izci ya da hata listesi yok. (Belki bu yapabileceğim en lanet olası ifadedir.) Yani bir kusur bulduğumuzda (algılanan ya da gerçek) tek yapabileceğimiz, yazara e-posta göndermek ve en iyisini ummaktır.
kojiro

3
@WillVousden, ... freenode #bash kanalındaki konsensüsün ne zamandır ABS'den kaçınılması gerektiğine dair bir geçmiş istiyorsanız , bkz. Wooledge.org/~greybot/meta/abs - her satırdaki ikinci alan zaman damgası ve ilk kullanıcı adıdır; Ümit ediyorum ki, söz konusu kullanıcı adlarının çok saygın bireyler olduğu iddiası yeterlidir.
Charles Duffy

32

Kıvrımlı parantez işlevleri, kendi kabuklarına ihtiyaç duymadıkça, çağrılan kabuk işleminde çalışır:

  • onları arka planda çalıştırdığınızda &
  • onları bir boru hattında bir link olarak çalıştırdığınızda

Yönlendirmeler veya ekstra ortam değişkenler yeni bir alt kabuğu zorlamaz:

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here

İşlevi, kıvrımlar yerine parantez içinde tanımlarsanız:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

her zaman yeni bir süreçte çalışacaktır.

Komut ikame $()de her zaman bash'te süreçler yaratır (fakat eğer onun içinde yerleşikler çalıştırırsanız ksh içinde değil).


f() (...)İzin verildiğini bilmiyordum . Dışında başka tanımlar var mıdır {...}ve (...)? Bash’te henüz başkalarına değilim.
Tomasz

1
@tomas kullanabilirsiniz function hw { echo hello world; } sözdizimi (gerek ()dışarı yazarsanız functionve doğru finalden sonra yönlendirmeleri belirtebilir }ya )olduğu gibi hw(){ echo error; } >&2işte bu konuda..
PSkocik

2
Bu hemen düşündüğüm cevap ve kesinlikle doğru. Doğru cevap olarak oylanması gerekir. f()(...)her zaman kendi kabuğunu çalıştır, f(){...}yapmaz.
rexkogitans

11
NB bash fonksiyonları herhangi bir bileşik komutunu kabul eder, bu yüzden foo() [[ x = x ]]geçerli bir fonksiyon tanımıdır. Bununla birlikte, işleve bakarsanız, bunun type foohala sözdizimsel bir şeker olduğunu göreceksiniz foo() { [[ x = x ]]; }. Aynısı alt kabuk fonksiyonları için de geçerlidir: bar() ( : )olur bar() { ( : ); }.
kojiro

1
@kojiro güzel +1. bunu bilmiyordum
PSkocik

9

Söz konusu örnekten söz konusu komut şuna benziyor:

echo ${arrayZ[@]/%e/$(replacement)}

Örnek daha sonra şunları belirtir:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

ABS Kılavuzuna hayırsever olmak, görünüşte yazmayı kastettiği, işlevin bir komut değiştirmenin içinde, bir komut değiştirmenin içindeki komutun bir alt kabukta çalışmasıdır .


Bu çok yanıltıcı. Yorumunuz için teşekkürler.
Tomasz

5
@tomas "çok yanıltıcı." Evet çok. ABS Kılavuzunun aksine, Greg'in Wiki'si mükemmel bir bash bilgisi kaynağıdır.
John1024

1
Şerefe. Bunun hakkındaki düşüncelerin neler: wiki.bash-hackers.org/start ?
Tomasz

@tomas Bu konuda ilk elden bilgim yok.
John1024

2
@tomas, ... bash hacker'ları kendi görüşüme göre wiki bunun mükemmel bir kaynak olduğu yönünde. Wooledge wiki'mde olduğu kadar kapsamlı olamadım, ancak doğru ve tam olarak yazılmış gibi görünüyor.
Charles Duffy
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.