Yanıtlar:
$(…)
tanımı gereği alt kabuktur: kabuk çalışma zamanı durumunun bir kopyası ¹ ve alt kabukta yapılan durumdaki değişikliklerin ebeveyn üzerinde etkisi yoktur. Bir alt kabuk genellikle tarafından uygulanan bölmek yeni bir işlem (ancak bazı kabukları, bazı durumlarda bu optimize edebilir).
Değişken değerlerini alabileceğiniz bir alt kabuk değildir. Değişkenlerdeki değişikliklerin ebeveyn üzerinde etkisi olsaydı, bu bir alt kabuk olmazdı. Bu ebeveynin çıktısını alabildiği bir alt kabuktur . Yaratılan alt kabuk $(…)
, standart çıktısını bir boruya ayarlamıştır ve ana bu borudan okur ve çıktıyı toplar.
Bir deniz kabuğu yaratan başka yapılar da var. Ben bash için tam liste bu olduğunu düşünüyorum:
( … )
) hiçbir şey yapmaz ama bir altkabuk oluşturmak ve sonlandırmak için bekleyin. { … }
Hangi grupların sadece sözdizimsel amaçlarla kullandığı ve alt kabuk oluşturmadığı kontrast… &
bir alt kabuk yaratır ve sonlandırılmasını beklemez.… | …
biri sol taraf için diğeri sağ taraf için olmak üzere iki alt kabuk oluşturur ve her ikisinin de sonlandırılmasını bekler. Kabuk bir boru oluşturur ve sol tarafın standart çıkışını borunun yazma ucuna ve sağ tarafın standart girişini okuma ucuna bağlar. Bazı mermilerde (ksh88, ksh93, zsh, lastpipe
seçenek ayarlanmış ve etkin olan bash ), sağ taraf orijinal kabukta çalışır, böylece boru hattı yapısı sadece bir alt kabuk oluşturur.$(…)
(aynı zamanda hecelenen `…`
), standart çıkışı bir boruya ayarlanmış olarak bir alt kabuk yaratır, ebeveyndeki çıktıyı toplar ve izleyen eksi satırlarını eksi olarak bu çıktıya doğru genişletir. (Ve çıktı daha fazla bölünmeye ve küreselleşmeye maruz kalabilir, ama bu başka bir hikaye.)<(…)
standart çıktısı bir boruya ayarlanmış bir alt kabuk oluşturur ve borunun adına genişler. Ana (veya başka bir işlem) alt kabuk ile iletişim kurmak için boruyu açabilir. >(…)
aynısını yapar, ancak standart girişe takılıyken.coproc …
bir alt kabuk oluşturur ve sonlandırılmasını beklemez. Alt kabuğun standart giriş ve çıkışlarının her biri, ebeveyn her bir borunun diğer ucuna bağlı olarak bir boruya ayarlanır.${...}
?
command | { read line; … }
(kabuğa bağlı olarak line
, boru hattından sonra hala mevcut olabilir veya olmayabilir). Tüm yollar bir alt kabuk içerir çünkü çıktı üreten komutun girdiyi okuyan kabuğundan bağımsız olarak çalışması gerekir. Komut tamamen kabuğun içindeyse (yalnızca kabuk yapıları ve yerleşimleri, harici komutlar yoktur), kabuk bir alt işlem oluşturmayabilir, ancak bu yalnızca bir optimizasyondur, yine de bir alt kabuk oluşturur.
Bash 4.4, bash (1) man sayfasından, "GENİŞLETME" bölümünde, "Komut Değiştirme" alt bölümünde:
Bash
command
bir denizaltı ortamında yürüterek genişlemeyi gerçekleştirir [...]
bash
manpage herhangi bir alt kabuktan bahsetmez: Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
Bunun kasıtlı bir ihmal olup olmadığını merak ediyorum.