Pergantian hampir identik dengan ekspansi dalam konteks ini karena maknanya tumpang tindih. Tidak satu pun sub kategori yang cukup lengkap dari yang lain, meskipun di bagian Manual GNU Anda referensi ada substitusi yang dianggap sebagai bagian dari ekspansi keseluruhan.
Sebuah ekspansi adalah penggalian nilai sebuah identifier. Misal, jika this=that
, saat kami berkembang, this
kami mendapatkannya that
. Perluasan yang tidak melibatkan substitusi ditentukan sebelumnya bahwa nilai yang digunakan sudah ada dan harus diambil, meskipun ini termasuk menggabungkan nilai yang didapat / nilai eksplisit (seperti dengan "ekspansi aritmatika").
Sebuah substitusi menciptakan nilai sebagai hasil dari operasi input / output eksplisit. Misalnya, jika this=$(foo bar)
, this
adalah hasil dari mengeksekusi foo bar
dan menangkap outputnya. 1 Meskipun nilai yang dihasilkan dari substitusi mungkin benar-benar dapat diprediksi, nilai ini berbeda dari yang diperoleh dalam ekspansi normal karena tidak benar-benar ada sampai substitusi terjadi - itu diproduksi.
Substitusi datang dalam dua rasa, perintah dan proses , yang agak simetris:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
"Perintah" di yang pertama adalah ls
, seperti "proses" di yang kedua. Kita dapat mengatakan apa yang diganti sebenarnya adalah ujung pipa. Substitusi proses tumpang tindih dengan pengalihan . Namun, ini mungkin agak terlalu di bawah batas teknis secara teknis, yang membawa kita ke catatan kaki ...
foo bar
dalam hal ini bisa menjadi fungsi shell internal, dalam hal ini tidak ada IO interprocess. Keberadaan shell built-in kurang jelas mengaburkan perbedaan ini. Dalam hal konten, input dan output akan sama.
variable expansion
,command substitution
. Apa keraguanmu?