Apa artinya yang berikut ini:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Saya khususnya tertarik pada bagian ini:
varible=$(...)
Saya tahu bahwa tanda kurung digunakan untuk menjalankan subproses, tetapi bagaimana jika mereka digunakan bersama dengan $
?
man bash
dan cari substitusi CommandJawaban:
Dari manual Bash (
man bash
):(Hal ini berlaku untuk semua Bourne-seperti kerang, yaitu
sh
,ksh
,zsh
,bash
dll, danzsh
juga mampu data capture dengan tertanam karakter NUL dengan cara ini)Perintah
akan menetapkan nama direktori tempat skrip berada (sambil juga mengubah semua garis miring terbalik ke garis miring) ke variabel
basedir
. Kesalahan, peringatan, atau pesan diagnostik lainnya yang dikeluarkan ke aliran kesalahan standar masih akan ditampilkan di terminal ($(...)
hanya menangkap keluaran standar dari perintah).Shell akan mulai dengan menjalankan substitusi perintah terdalam:
Output dari itu akan diberikan sebagai string
dirname
, dan output dari itu akan ditugaskan ke variabelbasedir
.Kutipan ganda ada untuk memastikan bahwa tidak ada pemisahan kata atau penggumpalan nama file akan dilakukan, jika tidak, Anda mungkin menemukan bahwa skrip gagal atau menghasilkan output aneh ketika
$0
(nama skrip termasuk jalur yang digunakan untuk menjalankannya) berisi spasi karakter atau karakter globbing nama file (seperti?
atau*
).Secara umum adalah ide yang baik untuk selalu mengutip ekspansi (ekspansi variabel, penggantian perintah, dan ekspansi aritmatika). Lihat pertanyaan ini dan jawabannya untuk penjelasan yang bagus mengapa ini adalah ide yang bagus.
Jika skrip dieksekusi sebagai
maka
basedir
akan mendapatkan nilai/usr/local/bin
.Atau, di Cygwin:
maka
basedir
akan mendapatkan nilaic:/Users/Me
. Double backslash pada baris perintah dalam kasus ini hanya untuk menghindari backslash tunggal dari shell. Nilai aktual$0
adalahc:\Users\Me\script.sh
.Cara lain untuk melakukan hal yang sama tanpa menggunakan
dirname
,echo
dansed
mungkinsumber
/bin/sh
Solaris 10 atau yang lebih lama) tidak mendukung$(...)
.Ini berarti menjalankan apa yang ada di dalam tanda kurung dalam sebuah subkulit dan mengembalikannya sebagai nilai , dalam kasus Anda menugaskan itu
varible
.sumber
The
varible=$(..)
disebut Command substitusi dan itu berarti apa-apa lebih tetapi untuk menjalankan perintah shell dan menyimpan output nya ke variabel atau menampilkan kembali menggunakan perintah echo. Misalnya, tampilkan tanggal dan waktu:dan untuk menyimpannya ke variabel:
Untuk info lebih lanjut: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
sumber