İhracat PATH = bir şey: $ PATH ne anlama geliyor?


27

Linux için çok yeniyim ve aşağıdaki komutu .profilegiriş klasörümün altına koyuyorum :

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

Ortam değişkenlerinin sorunlarını ve değerlerini Windows'tan biraz biliyorum, ancak bu durumda bu komutun ne yaptığını ve içerdiği kısımların neler olduğunu anlamak istiyorum:

  1. Başlangıçtaki bu "ihracat" ifadesi nedir? Bash için kullanılabilecek verileri dışa aktarıyor mu?

  2. İlk PATHnedir ve ikinci nedir $PATHve neden iki taneye ihtiyacımız var?


İşletim sistemleri arasındaki bazı teknik farklılıklar bir yana, Windows'taki bu işleme eşdeğer: windowsitpro.com/systems-management/…
Two-Bit Alchemist

1
"export", değişikliği bash tarafından başlatılan yeni programlara görünür kılar.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen: hayır, bu exportkomut kullansanız da kullanmasanız da olur , çünkü PATHdeğişken zaten dışa aktarılmış olarak işaretlenmiştir. (Bana inanmıyorsan, iki şekilde de dene!)
David

Yanıtlar:


39

Başlangıçtaki bu "ihracat" ifadesi nedir?

exportbir komuttur (daha doğrusu bir Bash yerleşiktir , yani yürütülebilir bir mevcut değildir PATH, Bash'in kendisinde yerleşik olan bir komuttur).

Bash için kullanılabilecek verileri dışa aktarıyor mu?

exportatamanın sol tarafındaki ortam değişkenini atamanın sağ tarafındaki değere ayarlar; Böyle bir ortam değişkeni, onu ayarlayan sürece ve aynı ortamda meydana gelen tüm alt işlemlere, yani bu durumda, aynı ortamda ~/.profilebulunan tüm alt işlemlere kaynak yapan Bash örneğine (örneğin, başka kabukları da içerebilir) görülebilir. , buna karşılık olarak erişebileceksiniz).

İlk PATHnedir ve ikinci nedir $PATHve neden iki taneye ihtiyacımız var?

PATHYukarıda açıklandığı gibi ilk , kullanılarak ayarlanacak çevre değişkenidir export.

Yana PATHnormalde bir şeyi içeren ~/.profile(içerdiği varsayılan olarak kaynaklı /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), basitçe ayarı PATHiçin ~/.composer/vendor/binyapmak istiyorum PATHsadece içerirler ~/.composer/vendor/bin.

Yani bu yana bir komut bir değişkene başvuruları değiştirilir (veya "genişletilmiş") komutunun değerlendirme zamanında Bash tarafından değişkenin değerini , :$PATHatanacak değerin sonunda alınır PATHböylece PATHiçeren yukarı uçları ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( yani PATHzaten ~/.composer/vendor/bin:başında artı olanları içerir ).


Müthiş açıklama.
Choylton B. Higginbottom

16

https://help.ubuntu.com/community/EnvironmentVariables muhtemelen size yardımcı olacaktır. Ayrıca man bashbunun nasıl çalıştığını anlamakta çok yardımcı olabilir (en azından Bash'te)

Her neyse - PATH=temelde PATHdeğişkeni ayarladığınız gibi, aramak için yeni yollar ekleyerek, önceden / önceden ayarlanmış yolları ekleyerek, $PATH(temel olarak PATHdeğişkene bir referanstır ).

Yani, PATHşimdiye dek böyle bir şeye ayarlanmış olduğunu söyleyin :

PATH="x:y:z"

ve sonra sen

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

senin PATHgibi olacak bundan sonra:

a:b:c:x:y:z

Umarım anlamlı olur.

Üstelik, yeni değişkeni dışa aktarırsınız, böylece ortamınızda alt işlemler / alt kabuklar da dahil olmak üzere bilinir.

Ayrıca, belirtilen dizinlerin sırasının PATHda önemli olabileceğinin farkında olun . Ve bunun gibi bir şey PATH="$PATH:a:b:c"size sonuç verecektir:

x:y:z:a:b:c

Bir komut ararken dizinlerin / yolların sırasını etkileyecektir (komutunuz birden fazla dizinde bulunuyorsa, ilk bulunanlar kullanılacaktır - bu da bazen beklenmedik sonuçlar verebilir).


2

İşte emir, böylece herkes kurşun noktalarından geçerken takip edebilecek. export PATH="~/.composer/vendor/bin:$PATH"

  • exportkabuk yerleşik (anlamı yok /bin/export, bu bir kabuk meselesidir) komutu temelde ortam değişkenlerini denilen diğer programlara bash(Ekstra Okuma'daki bağlantılı soruya bakın) ve alt kabuklara erişilebilir kılar .
  • Kabuktaki atama önce genişleyecektir, sonra atama ikinci gerçekleşecektir. Böylece, önce çift tırnak içindekiler genişler, PATHsonra değişkene kaydedilir .
  • $PATHVarsayılan PATHatamadır (veya bu komut sizin .bashrcveya görünene kadar değişkenin nasıl göründüğünü gösterir .profile) ve genişletin.
  • ~/.composer/vendor/bin, öndeki nokta nedeniyle gizli klasörün /home/username/.composer/vendor/binbulunduğu yere .composeraçılacak.
  • Bu kısa ~/.composer/vendor/bin:$PATH, şimdi ayrılmış, uzun klasörler listesine dönüştü :. Her şey çift tırnak içine alınır; böylece yollarına boşluk içeren klasörler ekleriz.
  • Sonunda her şey PATHdeğişkende saklanır ve kullanılmasına izin verilen harici komutlar

Basit bir örnek

Benim etkileşimli kabuğum aslında yerleşik mksholan da export. exportSet (set) kullanarak VAR, değişkenim sonraki değişken komutları / alt işlemler tarafından iletilebilir ve kullanılabilir; burada aynı değişkeni verdim

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

Ekstra okuma


3
Hayır, ~içinde ~/.composer/vendor/bingenişletilecek olmayacak! Tilde, yalnızca =işaretten hemen sonra olduğu gibi, birkaç özel yerde genişletilir . PATH="~/.foo:$PATH"sonuçlanır ~/.foo:/other/path/dirs.... Ancak ~, bununla PATH=~"/.foo:$PATH"sonuçlanacak şekilde genişletilecektir /home/user/.foo:/other/path/dirs....
Volker Siegel,

2

Burada ve web'deki diğer yerlerde okudum, bunun hakkında bir arkadaşımla konuştum ve bir birinci sınıf öğrencisi olarak (belki de bir Ubuntu birinci sınıf öğrencisi daha sonra bazılarının düşünebileceği gibi), bu komutu eşleştirmem gerektiğine karar verdim - bir harita yapmalı ve öyleyse onun ne olduğunu ve nerede olduğunu öğren:

Ön veri

Şimdilik bu bölümde bir şey anlamadıysanız - endişelenmeyin, okumaya devam edeceğiniz gibi netleşecektir, ancak bu konuyu anlamak için Çevre değişkenleri (EV'ler), değerleri ve amaçlarını okumanız gerekir. . Şimdi emri basit kelimelerle ve haritalama yöntemiyle, benim gibi yeni gelenler için ve sadece yeni gelenler için açıklamaya çalışacağım. Burada elimden gelenin en iyisini yapmaya çalıştım ...

haritalama

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

EV "PATH" in Ubuntu 15.10 ile birlikte orijinal değeri:

/usr/bin:/usr/sbin

Komutun kendisinde notumuzda iki PATH cümlesi var. Sonuncusu $ PATH - $, "yanınızda EV'nin orijinal değerini veya değerlerini yazdır" der; Yanındaki EV, PATH EV'dir.

Biz ihraç yolu değişkeni kendisi (yanı alt süreçleri için kullanıma sunulmadan, IE gibi içindeki aslında Bash kabuğunu değildir CLI koşmak, ancak run (işler Drush olduğunu Drupal ) CLI.

İhracatın yanı sıra genişlettik: İlk PATH deyimi (PATH =) bizi orijinal değere ($ PATH ile gösterilen) ekstra bir değer (~ /. Besteci / vendor / bin :) eklemek için kullandı.

  • İki nokta üst üste (:) yukarıdaki paragrafta bahsettiğim yeni değerin sonunda, yeni değeri orijinal değerden ayırmak için kullanılır.

  • "", Değerlerin bulunduğu alandır.

  • ~ Giriş klasörüdür.


Yaptığım bu haritalamadan sonra emrin benim gibi birinci sınıf öğrencilere daha açık olacağını umuyorum


1

exportKomut altkabuklarda değişkenler kullanılabilir hale getirir. Yani, onsuz değişken PATHalt kabuklarda görünmezdi.

PATH iki kez belirtildi:

  • Değişken olarak değer atanır, =işaretin solunda .
  • Değişken adı, =işaret hakkı ile değiştirilir . Bu eski değeri yeni değerin bir parçası yapar.

1
“Yani, onsuz değişken PATHalt kabuklarda görünmezdi.” Bu yanlış; PATHbir ortam değişkenidir ( kabuk değişkeni ile tamamen aynı değildir ), bu nedenle otomatik olarak dışa aktarılır ve exportkomut gereksizdir.
David

Bourne kabuğu ailesi kabuk ve çevre değişkenleri arasında bir ayrım yapmamaktadır. ( sc.tamu.edu/help/general/unix/vars.html ) Sistemimde (Arch Linux), bash setenvkomutu bile bilmiyor .
rexkogitans

1
Çekirdeğin bildiği ortam değişkenleri ile bash'a dahil olan kabuk değişkenleri arasında hala bir fark var. Çevreden PATHkaynaklandığından, otomatik olarak dışa aktarılır, böylece exportdeğişikliklerin alt işlemlere yayılması için koşmanıza gerek yoktur (bağladığınız sayfanın söylediklerinin aksine).
David

Ortam değişkenleri çekirdeğin değil sürecin bir özelliğidir. Burada bahsettiğimiz süreç sh, bash (Ubuntu zsh kullanıyor mu?) Olduğundan, onları kabuk değişkenlerine eşit olarak bırakabileceğimizi düşünüyorum. Ancak, elbette, kabuk değişkenleri ortam değişkenleri gibi rasgele programlara geçirilmez.
rexkogitans 14:16

Sanırım bu noktada anlamsal olarak tıkanıyoruz. Söylemeye çalıştığım tek şey, kısaca PATH=foove export PATH=fooözdeş davranışa sahipti.
David

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. Bu exportbash bir buildin komutu, verme değişkenlerinin envirement değişkeni olduğu anlamına gelir. ( help exportdaha fazla eğilmek için yazabilirsiniz

    (komutu izleyen karakterler boşlukla bölünmüş parammetrelerdir, bu durumda bu durumda sadece bir parametre vardır)

  2. PATHUppercase içinde adlandırılacak değişken adı bash tarafından genellikle önceden tanımlanmış varibale vardır.

  3. =Bu değişkene atama değer anlamına gelir.

  4. tüm dize varibale değeridir

  5. bu , bash parametresinde var $PATHolanın variable expantiondeğerini değiştirecek olan bash'ın funciton türüdür PATH, dizeyi exportkomuta göndermeden ÖNCE

  6. :bu değişkeni kullanmak istediğiniz tüm uygulama tarafından YOLU değişken ve understooded içinde spcial char. seperatör demektir. Bu yüzden PATH değişkeninde birçok dizin olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.