Apa arti dari $ {GZIP_BINDIR - '/ bin'} dalam bash?

13

Adakah yang bisa menjelaskan apa arti perintah ini?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Rashmi Narahari
sumber

Jawaban:

19

${GZIP_BINDIR-'/bin'}adalah bashpola ekspansi parameter. Dari man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Segera sebelum halaman manual bagian ini telah (terima kasih kepada @jwodder untuk memberi tahu):

Omitting the colon results in a test only for a parameter that is unset.

Seperti yang dikatakan halaman manual, ini akan menetapkan nilai default variabel GZIP_BINDIR. Jika GZIP_BINDIRmemiliki nilai yang sebelumnya ditetapkan (selain nol karena Anda tidak menggunakan :) maka nilai itu akan digunakan, jika tidak /binakan digunakan sebagai nilai variabel GZIP_BINDIR.

Di sisi lain, jika Anda juga ingin menguji nilai-nilai nol, gunakan pola ini (termasuk :):

${GZIP_BINDIR:-'/bin'}

Setelah itu $PATHakan diperluas ke nilai-nilai yang dipegangnya sebelumnya. Jadi, jika PATHsebelumnya sudah:

/usr/sbin:/usr/bin

Sekarang Anda PATHakan (mengingat GZIP_BINDIRtidak diatur):

/bin:/usr/sbin:/usr/bin

export PATHakan membuat ini PATHtersedia untuk semua proses anak.

heemayl
sumber
" Saya pikir Anda telah melewatkan :di${GZIP_BINDIR-'/bin'} " Belum tentu. ${parameter-word}juga valid, meskipun sepertinya tidak ada di halaman manual.
nyuszika7h
@ nyuszika7h Ya..saya tidak tahu sebelumnya..jelas mengapa ini tidak termasuk dalam manual ..
heemayl
Di halaman manual bash di komputer saya, paragraf di atas bagian pada :-mengatakan: "Ketika tidak melakukan ekspansi substring, menggunakan formulir yang didokumentasikan di bawah ini (misalnya :-), tes bash untuk parameter yang tidak disetel atau nol. Menghilangkan titik dua menghasilkan pengujian hanya untuk parameter yang tidak disetel. "
jwodder
Sebagai catatan tambahan, Anda dapat menggabungkan pengaturan PATHdan exportke dalam satu perintah sebagai berikut:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

Apakah benar-benar tidak ada titik dua sebelum tanda hubung di dalam ekspansi parameter ${GZIP_BINDIR-'/bin'}?

Konstruk semacam ini hampir selalu ditulis dengan titik dua, seperti ${GZIP_BINDIR:-'/bin'}artinya, "jika $ GZIP_BINDIR NULL atau tidak disetel, tetapkan ke '/ bin'"

Namun, sintaks yang Anda berikan adalah valid, tapi jarang. ${GZIP_BINDIR-'/bin'}(tanpa titik dua) berarti, "jika $ GZIP_BINDIR tidak disetel, setel ke '/ bin'". Jika diset (telah dideklarasikan) tetapi tidak ada yang ditugaskan padanya (mis. NULL) tidak ada yang akan dimasukkan.

Mungkin ada bug di sini sebagai titik dua yang mengikuti konstruk variabel (...}: $ PATH ...) akan tetap dimasukkan jika $ GZIP_BINDIR adalah set tapi NULL. Karena ini akan menambah titik dua di awal $ PATH, itu akan menyebabkan direktori saat ini dicari terlebih dahulu.

Itu dianggap oleh sebagian besar sebagai masalah keamanan karena membuatnya lebih mudah untuk menyebabkan program jahat dengan nama yang sama dengan perintah standar untuk dijalankan hanya dengan meletakkannya di direktori saat ini.

Agar $ PATH tidak berubah jika $ GZIP_BINDIR disetel tetapi NULL (kosong), sintaks yang benar adalah ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Agar $ PATH tidak berubah jika $ GZIP_BINDIR tidak disetel atau disetel tetapi NULL, sintaks yang benar adalah ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
sumber
2

Perintah ini memperbarui variabel PATH.

Ini PATHadalah variabel lingkungan yang menetapkan sekumpulan direktori tempat program yang dapat dieksekusi berada.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Ini menambah nilai variabel lain GZIP_BINDIRjika keluar ke PATH lain gunakan / bin sebaliknya dan tambahkan ke PATH

export PATH

ekspor digunakan untuk mengatur PATH tersedia untuk semua proses anak dan subkulit Baca ini untuk informasi lebih lanjut tentang

Anda harus mencatat bahwa ini bukan statis dan Anda akan kehilangan itu setelah Anda keluar dari shell Anda.

Untuk menjadikan edit PATH ini permanen, Anda harus menambahkan baris ini ke .bashrc

gedit .bashrc

dan tambahkan baris

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

kemudian jalankan perintah

source .bashrc
Maythux
sumber
GZIP_BINDIR adalah variabel
Maythux
apa yang tidak benar Tidak saya tidak punyaku
diturunkan
Mengapa downvoting ?!
Maythux