Ekspansi dan Substitusi tampaknya saling bertukar pada konteks yang sama dalam bahasa pemrograman shell. Misalnya, beberapa dokumen seperti manual referensi Bash , Bash Hackers Wiki menggunakan kata 'ekspansi' untuk menjelaskan ' ekspansi parameter shell '. Namun, beberapa dokumen lain sepertinya lebih menyukai kata 'substitusi'. Panduan Bash-Scripting Lanjutan menggunakan substituion parameter .
Apakah ada perbedaan antara 'ekspansi' dan 'substitusi' dalam hal terminologi pemrograman shell?
shell-script
terminology
MS.Kim
sumber
sumber
variable expansion
,command substitution
. Apa keraguanmu?man sh
danman set
. Dan ketika Anda memiliki hal-hal itu, maka Anda melakukan dokumen khusus shell.Jawaban:
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 mendapatkannyathat
. 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 mengeksekusifoo 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:
"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.sumber
Saya pikir perbedaannya pada umumnya terlalu kecil untuk diperhatikan - dan istilah ini sering digunakan secara bergantian. Meskipun, jika Anda melihat di atas dua kasus, Anda dapat melihat bahwa dalam contoh kita pertama pengganti
$1
untuk$2
sebagai akibat dari ekspansi dari$2
. Segera setelah$2
tidak dapat diperluas tidak ada substitusi.goldilocks membuat poin yang bagus tentang keberadaan substitusi yang halus. Sepertinya kucing Schrodinger, kurasa. Itu mengingatkan saya pada sesuatu. Anda mungkin tidak terbiasa dengan bentuk ekspansi parameter yang ditentukan POSIX ini, tetapi ia bekerja dengan cara yang berlawanan dengan bentuk di atas:
Sekarang terkadang saya menginginkan perilaku yang sama tetapi untuk
set
nilai. POSIX tidak menentukan perilaku itu untuk apa pun secara tepat. Tapi, dengan satu atau dua trik, itu berhasil:Tapi:
sumber