Apa artinya ekspor PATH = sesuatu: $ PATH artinya?

27

Saya sangat baru di Linux dan saya menempatkan perintah berikut di akhir file di .profilebawah folder rumah saya:

export PATH="~/.composer/vendor/bin:$PATH"

Saya tahu masalah variabel lingkungan dan nilainya sedikit dari Windows, tetapi dalam hal ini saya ingin memahami apa yang dilakukan perintah ini, dan apa saja bagian yang terdiri dari:

  1. Apa ungkapan "ekspor" ini di awal? Apakah ini mengekspor data agar tersedia untuk Bash?

  2. Apa yang pertama PATHdan apa yang kedua $PATH, dan mengapa kita perlu dua?

JohnDoea
sumber
Beberapa perbedaan teknis antara OS samping, itu setara dengan proses ini pada Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist
1
"ekspor" membuat perubahan terlihat oleh program baru yang diluncurkan oleh bash.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: tidak, itu terjadi apakah Anda menggunakan exportperintah atau tidak , karena PATHvariabel sudah ditandai sebagai diekspor. (Cobalah dua-duanya jika Anda tidak percaya kepada saya!)
David

Jawaban:

39

Apa ungkapan "ekspor" ini di awal?

exportadalah sebuah perintah (lebih tepatnya itu adalah Bash builtin , artinya ini bukan hadiah yang bisa dieksekusi PATH, itu adalah perintah yang Bash punya built-in dalam dirinya sendiri).

Apakah ini mengekspor data agar tersedia untuk Bash?

exportmenetapkan variabel lingkungan di sisi kiri penugasan ke nilai di sisi kanan penugasan; variabel lingkungan seperti itu terlihat oleh proses yang menetapkannya dan untuk semua subproses yang muncul dalam lingkungan yang sama, yaitu dalam hal ini ke instance Bash yang sumber ~/.profiledan semua subproses yang muncul dalam lingkungan yang sama (yang mungkin mencakup misalnya juga kerang lain , yang pada gilirannya akan dapat mengaksesnya).

Apa yang pertama PATHdan apa yang kedua $PATH, dan mengapa kita perlu dua?

Yang pertama PATHseperti dijelaskan di atas adalah variabel lingkungan yang akan ditetapkan menggunakan export.

Karena PATHbiasanya berisi sesuatu ketika ~/.profilebersumber (secara default mengandung /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), hanya pengaturan PATHuntuk ~/.composer/vendor/binmembuat PATHmengandung saja ~/.composer/vendor/bin.

Jadi karena referensi ke variabel dalam perintah diganti dengan (atau "diperluas" ke) nilai variabel oleh Bash pada saat evaluasi perintah , :$PATHdiletakkan di akhir nilai yang akan ditugaskan PATHsehingga PATHberakhir mengandung ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( yaitu apa yang PATHsudah berisi plus ~/.composer/vendor/bin:di awal).

kos
sumber
Penjelasan hebat.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables mungkin akan membantu Anda. Juga man bashmungkin sangat membantu dengan memahami cara kerjanya (setidaknya di Bash)

Pokoknya - seperti untuk PATH=Anda pada dasarnya mengatur PATHvariabel, menambahkan beberapa jalur baru untuk mencari, menambahkan pada akhir sudah / sebelumnya mengatur jalur, dengan $PATH(yang pada dasarnya merupakan referensi ke PATHvariabel).

Jadi, katakan Anda PATHsejauh ini diatur untuk sesuatu seperti:

PATH="x:y:z"

dan kemudian Anda atur

PATH="a:b:c:$PATH"

PATHsetelah Anda akan seperti:

a:b:c:x:y:z

Saya harap itu masuk akal.

Dan di atas itu Anda mengekspor variabel baru sehingga dikenal di lingkungan Anda termasuk juga proses anak / subkulit.

Perlu diketahui juga bahwa urutan direktori yang diatur PATHdapat menjadi penting. Dan sesuatu seperti PATH="$PATH:a:b:c"akan memberi Anda hasilnya:

x:y:z:a:b:c

yang akan memengaruhi urutan direktori / jalur saat mencari perintah (jika Anda memiliki perintah di lebih dari satu direktori, yang pertama ditemukan akan digunakan - yang terkadang memberi Anda beberapa hasil yang tidak terduga).

Jacek
sumber
2

Inilah perintahnya sehingga setiap orang dapat mengikuti saat mereka melewati poin-poin. export PATH="~/.composer/vendor/bin:$PATH"

  • export/bin/exportperintah shell built-in (artinya tidak ada , ini shell) pada dasarnya membuat variabel lingkungan tersedia untuk program lain yang dipanggil dari bash(lihat pertanyaan terkait di Extra Reading) dan subkulit.
  • Penugasan dalam shell akan dilakukan ekspansi terlebih dahulu, kemudian penugasan akan berlangsung kedua. Jadi apa yang ada di dalam tanda kutip ganda diperluas terlebih dahulu, disimpan ke PATHvariabel nanti.
  • $PATHadalah PATHpenugasan default (atau paling tidak seperti apa variabel hingga perintah ini muncul di Anda .bashrcatau .profile), dan perluas.
  • ~/.composer/vendor/binakan diperluas ke /home/username/.composer/vendor/bin, di mana .composerfolder tersembunyi karena titik terkemuka.
  • Pendek itu ~/.composer/vendor/bin:$PATHsekarang telah berubah menjadi daftar folder yang panjang, dipisahkan oleh :. Semuanya terlampir menjadi tanda kutip ganda sehingga kami menyertakan folder dengan spasi di jalurnya.
  • Akhirnya semuanya disimpan dalam PATHperintah variabel dan eksternal yang diizinkan untuk menggunakannya

Contoh sederhana

Shell interaktif saya sebenarnya mksh, yang kebetulan juga memiliki exportbuiltin. Dengan menggunakan exportto set VAR, variabel saya dapat diteruskan ke dan digunakan oleh rantai perintah / subproses berikutnya, tempat saya mengekspor variabel yang sama

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Bacaan Ekstra

Sergiy Kolodyazhnyy
sumber
3
Tidak, ~in ~/.composer/vendor/bintidak akan diperluas! Tilde hanya diperluas di beberapa tempat khusus, seperti langsung setelah =tanda. PATH="~/.foo:$PATH"hasil dalam ~/.foo:/other/path/dirs.... Tetapi ~akan diperluas PATH=~"/.foo:$PATH", yang menghasilkan /home/user/.foo:/other/path/dirs....
Volker Siegel
2

Saya telah membaca di sini dan di tempat-tempat lain di web, berbicara dengan seorang teman tentang ini dan memutuskan bahwa sebagai mahasiswa baru (mungkin lebih dari mahasiswa baru Ubuntu maka beberapa di sini mungkin berpikir), saya harus memetakan perintah ini - saya harus membuat peta dan jadi pelajari tentang keberadaan dan keberadaannya:

Data awal

Jika untuk saat ini Anda tidak memahami sesuatu dalam bab ini - jangan khawatir, itu akan menjadi lebih jelas karena Anda akan terus membaca, tetapi untuk memahami hal ini Anda perlu membaca tentang variabel Lingkungan (EV), nilai-nilainya, dan tujuannya . Sekarang saya akan mencoba menjelaskan perintah dengan kata-kata sederhana dan dalam metode pemetaan, untuk pendatang baru seperti saya, dan hanya untuk pendatang baru. Mencoba melakukan yang terbaik di sini ...

Pemetaan

export PATH="~/.composer/vendor/bin:$PATH"

Nilai asli dari EV "PATH" seperti yang disertakan dengan Ubuntu 15.10, adalah:

/usr/bin:/usr/sbin

Dalam catatan perintah itu sendiri kita memiliki dua frase PATH. Yang terakhir adalah $ PATH - $ mengatakan "cetak nilai asli atau nilai EV di sebelah Anda"; EV di sebelahnya adalah PATH EV.

Kami mengekspor variabel path itu sendiri (membuatnya tersedia untuk sub proses juga, proses IE yang berjalan di CLI yang sebenarnya bukan Bash shell, tetapi dijalankan di dalamnya (seperti Drush , yang merupakan CLI Drupal ).

Selain ekspor, kami juga memperluasnya: Frasa PATH pertama (PATH =) menggunakan kami untuk menambahkan nilai tambahan (~ / .composer / vendor / bin :) ke nilai asli (diwakili oleh $ PATH).

  • Tanda titik dua (:) di akhir nilai baru yang saya sebutkan di paragraf di atas, digunakan untuk membedakan nilai baru dari yang asli.

  • "" Adalah area di mana nilai berada.

  • ~ Adalah folder rumah.


Saya berharap setelah pemetaan ini saya lakukan, perintah akan lebih jelas untuk mahasiswa baru seperti saya.

JohnDoea
sumber
1

The exportperintah membuat variabel yang tersedia di subkulit. Artinya, tanpa itu, variabel PATHtidak akan terlihat dalam subkulit.

PATH disebutkan dua kali:

  • Sebagai variabel, nilai ditugaskan, di sebelah kiri =tanda.
  • Sebagai nama variabel digantikan oleh nilainya hak =tanda. Ini membuat nilai lama menjadi bagian dari nilai baru.
rexkogitans
sumber
1
"Artinya, tanpa itu, variabel PATHtidak akan terlihat dalam subkulit." Ini salah; PATHadalah variabel lingkungan (yang tidak persis sama dengan variabel shell ) sehingga diekspor secara otomatis, dan exportperintahnya tidak perlu.
David
Keluarga shell Bourne tidak benar-benar membedakan antara variabel shell dan lingkungan. ( sc.tamu.edu/help/general/unix/vars.html ) Di sistem saya (Arch Linux), bash bahkan tidak tahu setenvperintahnya.
rexkogitans
1
Masih ada perbedaan antara variabel lingkungan yang diketahui kernel, dan variabel shell yang internal ke bash. Karena PATHberasal dari lingkungan, maka secara otomatis diekspor, jadi Anda tidak perlu menjalankan exportagar perubahan disebarkan ke proses anak (bertentangan dengan apa yang dikatakan halaman yang ditautkan).
David
Variabel lingkungan bukan properti dari kernel, tetapi dari proses. Karena proses yang kita bicarakan di sini adalah sh, bash (apakah Ubuntu menggunakan zsh?), Saya pikir kita bisa membiarkannya sama dengan variabel shell. Tapi, tentu saja, variabel shell tidak diteruskan ke program acak seperti variabel lingkungan.
rexkogitans
Saya pikir kita terjebak dalam semantik pada saat ini. Yang saya coba katakan adalah bahwa dalam bash, PATH=foodan export PATH=foomemiliki perilaku yang identik.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. itu exportadalah perintah build dari bash, berarti variabel ekspor menjadi variabel envirement. (Anda bisa mengetik help exportuntuk bersandar lebih banyak

    (karakter yang mengikuti perintah adalah parameter, dibagi dengan spasi, jadi dalam hal ini, hanya ada satu parameter)

  2. itu PATHadalah nama variabel, biasanya, varibale yang telah ditentukan oleh bash, dinamai dalam Huruf besar.

  3. yang =berarti nilai assign ke variabel ini.

  4. semua string adalah nilai dari varibale

  5. itu $PATHadalah semacam fungsi bash, bernama variable expantion, bash akan menggantikan nilai yang ada PATHdi string parameter, SEBELUM mengirim string ke exportperintah

  6. yang :di char spcial dalam variabel PATH dan understooded oleh semua aplikasi yang ingin menggunakan variabel ini. itu berarti seperator. sehingga mereka akan memiliki banyak direktori dalam variabel PATH.

lovespring
sumber