Saya hanya ingin memahami baris kode berikut di shell. Ini digunakan untuk mendapatkan direktori kerja saat ini. Saya sadar bahwa $(variable)
nama mengembalikan nilai di dalam nama variabel, tetapi apa yang $(command)
seharusnya dikembalikan? Apakah itu mengembalikan nilai setelah menjalankan perintah? Dalam hal ini, kita dapat menggunakan `
untuk menjalankan perintah.
CWD="$(cd "$(dirname $0)"; pwd)"
Output yang sama dapat diambil dari baris kode berikut juga di versi shell yang berbeda
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Saya tidak dapat memahami arti dari $(cd..
dan $(dirname
.
Adakah yang bisa membantu saya untuk mengetahui bagaimana perintah ini dijalankan?
$()
vs``
.: stackoverflow.com/questions/9449778/…Jawaban:
Penggunaan
$
sejenisnya${HOME}
memberikan nilai HOME. Penggunaan cara$
serupa$(echo foo)
menjalankan apa pun yang ada di dalam tanda kurung di subkulit dan mengembalikannya sebagai nilainya. Dalam contoh saya, Anda akan mendapatkanfoo
karenaecho
akan menulisfoo
ke standarsumber
$(...)
adalah cara yang lebih baik untuk menulis perintah daripada mencoba menggunakan tanda kutip belakang. Pertimbangkan untuk menulis:gcclib=$(dirname $(dirname $(which gcc)))/lib
menggunakan tanda kutip belakang. Bahkan sebelum Anda mengalami kesulitan melakukannya di penurunan harga, itu lebih sulit karena Anda harus menghindari kutipan balik dari perintah bersarang, sedangkan Anda tidak dengan$(...)
notasi.$(echo foo)
membuat substitusi perintah, bukan subkulit. Jawaban lain saat ini benar. Saya pikir substitusi perintah dijalankan dalam subkulit, semacam itu, tetapi konsepnya masih berbeda.$(echo foo)
akan mencoba menjalankan apa yang dikembalikan dari tanda kurung, perintah ini akan berjalan terlebih dahuluecho foo
kemudian akan mencoba menjalankanfoo
yang memberikan kesalahanMari kita lihat bagian-bagian perintah yang berbeda.
BASH_SOURCE
adalah variabel bash array yang berisi nama file sumber. Jadi"${BASH_SOURCE[0]}"
akan mengembalikan Anda nama file skrip.dirname
adalah utilitas yang disediakan oleh coreutils GNU yang menghapus komponen terakhir dari nama file. Jadi jika Anda mengeksekusi skrip Anda dengan mengatakanbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
akan kembali.
. Jika Anda berkatabash ../foo
, itu akan kembali..
; karenabash /some/path/foo
itu akan kembali/some/path
.Akhirnya, seluruh perintah
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
mendapatkan direktori absolut yang berisi skrip yang sedang dipanggil.$(...)
memungkinkan substitusi perintah, yaitu memungkinkan keluaran dari suatu perintah untuk menggantikan perintah itu sendiri dan dapat disarangkan.sumber
dirname
mengembalikan jalur file yang dieksekusi (relatif atau absolut ke direktori kerja saat ini),cd
mengubah pwd ke direktori itu, danpwd
mencetak jalur absolut dari direktori kerja saat ini. Tapi kenapa mereka bergabung&&
? Dan apa yang akanDIR
terjadi jikacd
gagal?&&
mencegahpwd
berjalan jikacd
gagal, seperti ituDIR
akan kosong daripada memiliki direktori yang salah.