ส่งออก PATH = อะไร: $ PATH หมายถึงอะไร


27

ฉันยังใหม่กับ Linux และฉันวางคำสั่งต่อไปนี้ไว้ท้ายไฟล์.profileภายใต้โฮมโฟลเดอร์ของฉัน:

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

ฉันรู้ปัญหาของตัวแปรสภาพแวดล้อมและค่าของพวกเขาเล็กน้อยจาก Windows แต่ในกรณีนี้ฉันต้องการที่จะเข้าใจสิ่งที่คำสั่งนี้ทำและสิ่งที่เป็นส่วนประกอบด้วย:

  1. วลี "ส่งออก" นี้ตอนเริ่มต้นคืออะไร มันกำลังส่งออกข้อมูลเพื่อให้สามารถใช้งานกับ Bash ได้หรือไม่

  2. อะไรคือPATHสิ่งที่หนึ่งและที่สองคืออะไร$PATHและทำไมเราถึงต้องการสอง


ความแตกต่างทางด้านเทคนิคระหว่าง OSes กันมันเทียบเท่ากับกระบวนการนี้บน Windows: windowsitpro.com/systems-management/ …
นักเล่นแร่แปรธาตุ Two-Bit

1
"ส่งออก" ทำให้การเปลี่ยนแปลงปรากฏต่อโปรแกรมใหม่ที่เปิดตัวด้วยการทุบตี
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen: ไม่, เกิดขึ้นไม่ว่าคุณจะใช้exportคำสั่งหรือไม่, เพราะPATHตัวแปรถูกทำเครื่องหมายว่าส่งออกแล้ว (ลองทั้งสองวิธีถ้าคุณไม่เชื่อฉัน)
เดวิด

คำตอบ:


39

วลี "ส่งออก" นี้ตอนเริ่มต้นคืออะไร

exportเป็นคำสั่ง (โดยเฉพาะอย่างยิ่งมันเป็นBash ในตัวนั่นคือมันไม่ใช่สิ่งที่ปฏิบัติการได้ในPATHมันเป็นคำสั่งที่ Bash มีอยู่ในตัวเอง)

มันกำลังส่งออกข้อมูลที่จะใช้งานได้สำหรับ Bash หรือไม่

exportตั้งค่าตัวแปรสภาพแวดล้อมทางด้านซ้ายของการกำหนดเป็นค่าทางด้านขวาของการกำหนด ตัวแปรสภาพแวดล้อมดังกล่าวสามารถมองเห็นได้ในกระบวนการที่ตั้งค่าและไปยังกระบวนการย่อยทั้งหมดที่เกิดในสภาพแวดล้อมเดียวกันเช่นในกรณีนี้กับอินสแตนซ์ Bash ที่แหล่งที่มา~/.profileและไปยังกระบวนการย่อยทั้งหมดที่เกิดในสภาพแวดล้อมเดียวกัน ซึ่งจะสามารถเข้าถึงได้)

อะไรคือPATHสิ่งที่หนึ่งและที่สองคืออะไร$PATHและทำไมเราถึงต้องการสอง

ครั้งแรกที่ได้อธิบายข้างต้นเป็นตัวแปรสภาพแวดล้อมในการตั้งค่าการใช้PATHexport

เนื่องจากPATHปกติมีบางสิ่งบางอย่างเมื่อ~/.profileมีที่มา (โดยปกติจะมี/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games) เพียงการตั้งค่าPATHเพื่อ~/.composer/vendor/binจะทำให้มีเพียงPATH~/.composer/vendor/bin

ดังนั้นตั้งแต่อ้างอิงกับตัวแปรในคำสั่งจะถูกแทนที่ด้วย (หรือ "ขยาย" เพื่อ) ค่าของตัวแปรโดยการทุบตีในช่วงเวลาของการประเมินผลของคำสั่งที่ , :$PATHจะใส่ในตอนท้ายของมูลค่าที่จะได้รับมอบหมายให้PATHเพื่อให้PATHปลายขึ้นมี~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( เช่นสิ่งที่PATHมีอยู่แล้วบวก~/.composer/vendor/bin:ที่จุดเริ่มต้น)


คำอธิบายที่ยอดเยี่ยม
Choylton B. Higginbottom

16

https://help.ubuntu.com/community/EnvironmentVariablesอาจช่วยคุณได้ นอกจากนี้ยังman bashอาจเป็นประโยชน์อย่างมากกับการทำความเข้าใจวิธีการทำงาน

อย่างไรก็ตาม - สำหรับPATH=คุณโดยทั่วไปแล้วการตั้งค่าPATHตัวแปรเพิ่มเส้นทางใหม่บางอย่างเพื่อค้นหาผ่านเพิ่มที่ส่วนท้ายแล้ว / ก่อนหน้านี้กำหนดเส้นทางด้วย$PATH(ซึ่งโดยทั่วไปจะอ้างอิงถึงPATHตัวแปร)

ดังนั้นพูดว่าคุณPATHถูกตั้งค่าจนเป็นเช่น:

PATH="x:y:z"

และจากนั้นคุณตั้ง

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

PATHหลังจากนั้นคุณจะเป็นเช่น:

a:b:c:x:y:z

ฉันหวังว่ามันสมเหตุสมผล

และนอกเหนือจากนั้นคุณยังส่งออกตัวแปรใหม่เพื่อให้เป็นที่รู้จักในสภาพแวดล้อมของคุณรวมถึงกระบวนการลูก / subshells

เพิ่งทราบด้วยว่าลำดับของไดเรกทอรีที่ตั้งไว้PATHนั้นมีความสำคัญ และสิ่งที่ชอบPATH="$PATH:a:b:c"จะให้ผลลัพธ์:

x:y:z:a:b:c

ซึ่งจะส่งผลต่อลำดับของไดเรกทอรี / พา ธ ในขณะที่ค้นหาคำสั่ง (หากคุณมีคำสั่งในไดเรกทอรีมากกว่าหนึ่งไดเรกทอรีพบครั้งแรกจะถูกใช้ - ซึ่งอาจให้ผลลัพธ์ที่ไม่คาดคิดบางครั้ง)


2

นี่คือคำสั่งเพื่อให้ทุกคนสามารถทำตามได้เมื่อพวกเขาผ่านจุดแสดงหัวข้อย่อย export PATH="~/.composer/vendor/bin:$PATH"

  • exportbuilt-in shell (หมายถึงไม่มี/bin/exportมันเป็นเชลล์) คำสั่งโดยทั่วไปทำให้ตัวแปรสภาพแวดล้อมพร้อมใช้งานสำหรับโปรแกรมอื่นที่เรียกจากbash(ดูคำถามที่เชื่อมโยงใน Extra Reading) และ subshells
  • การมอบหมายในเชลล์จะทำการขยายก่อนจากนั้นการมอบหมายจะเกิดขึ้นที่สอง ดังนั้นสิ่งที่อยู่ภายในเครื่องหมายคำพูดคู่จะได้รับการขยายก่อนบันทึกในPATHตัวแปรในภายหลัง
  • $PATHคือการPATHกำหนดค่าเริ่มต้น(หรืออย่างน้อยสิ่งที่ตัวแปรดูเหมือนจนถึงคำสั่งนี้จะปรากฏในของคุณ.bashrcหรือ.profile) และขยาย
  • ~/.composer/vendor/binเป็นไปได้ที่จะขยายไป/home/username/.composer/vendor/binที่.composerถูกซ่อนโฟลเดอร์เนื่องจากจุดชั้นนำ
  • สั้น ๆ ที่มีการเปลี่ยนแปลงในขณะนี้เป็นรายการยาวของโฟลเดอร์ที่แยกจากกันโดย~/.composer/vendor/bin:$PATH :ทุกอย่างถูกรวมอยู่ในเครื่องหมายคำพูดคู่เพื่อให้เรารวมโฟลเดอร์ที่มีช่องว่างในเส้นทางของพวกเขา
  • ในที่สุดทุกอย่างจะถูกเก็บไว้ในPATHคำสั่งตัวแปรและภายนอกได้รับอนุญาตให้ใช้มัน

ตัวอย่างง่ายๆ

เปลือกโต้ตอบของฉันเป็นจริงmkshซึ่งเกิดขึ้นกับมีในexportตัว ด้วยการใช้exportการตั้งค่าVARตัวแปรของฉันสามารถถูกส่งผ่านไปยังและใช้โดยการต่อเนื่องของคำสั่ง / กระบวนการย่อยซึ่งฉันส่งออกตัวแปรเดียวกันนั้น

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

อ่านเพิ่มเติม


3
ไม่การ~เข้า~/.composer/vendor/binจะไม่ขยายออก! ตัวหนอนจะถูกขยายในสถานที่พิเศษเพียงไม่กี่แห่งเช่นหลัง=ป้าย ผลในการPATH="~/.foo:$PATH" ~/.foo:/other/path/dirs...แต่~จะได้รับการขยายตัวในซึ่งผลในการPATH=~"/.foo:$PATH" /home/user/.foo:/other/path/dirs...
Volker Siegel

2

ฉันได้อ่านที่นี่และที่อื่น ๆ ในเว็บได้พูดคุยกับเพื่อนเกี่ยวกับเรื่องนี้และตัดสินใจว่าในฐานะน้องใหม่ (อาจจะเป็นน้องใหม่ของ Ubuntu มากกว่านี้บางคนอาจคิดว่าที่นี่) ฉันควรแมปคำสั่งนี้ - ฉันควรทำแผนที่และ ดังนั้นเรียนรู้ว่ามันคืออะไรและที่อยู่:

ข้อมูลเบื้องต้น

หากตอนนี้คุณไม่เข้าใจบางสิ่งในบทนี้ - ไม่ต้องกังวลมันจะชัดเจนขึ้นในขณะที่คุณอ่านต่อไป แต่เพื่อที่จะเข้าใจในเรื่องนี้คุณจำเป็นต้องอ่านเกี่ยวกับตัวแปรสภาพแวดล้อม (EVs) ค่านิยมและวัตถุประสงค์ . ตอนนี้ฉันจะพยายามอธิบายคำสั่งด้วยคำง่าย ๆ และในวิธีการแมปสำหรับผู้มาใหม่อย่างฉันและสำหรับผู้มาใหม่เท่านั้น พยายามทำให้ดีที่สุดที่นี่ ...

การทำแผนที่

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

ค่าดั้งเดิมของ EV "PATH" ที่มาพร้อมกับ Ubuntu 15.10 คือ:

/usr/bin:/usr/sbin

ในคำสั่งตัวเองทราบว่าเรามีสองเส้นทางวลี อันสุดท้ายคือ $ PATH - $ บอกว่า "พิมพ์ค่าดั้งเดิมหรือค่า EV ถัดจากคุณ"; EV ถัดจากนั้นคือ PATH EV

เราส่งออกตัวแปรพา ธ เอง (ทำให้พร้อมใช้งานสำหรับกระบวนการย่อยเช่นกันกระบวนการ IE ที่ทำงานใน CLI ซึ่งไม่ใช่เชลล์ Bash จริง ๆ แต่ทำงานอยู่ภายใน (เช่นDrushซึ่งเป็นDrupal CLI)

นอกจากการส่งออกแล้วเรายังขยาย: วลี PATH แรก (PATH =) ใช้เราเพื่อเพิ่มมูลค่าพิเศษ (~ / .composer / ผู้ขาย / bin :) ไปยังค่าดั้งเดิม (แสดงด้วย $ PATH)

  • เครื่องหมายจุดคู่ (:) ในตอนท้ายของค่าใหม่ที่ฉันกล่าวถึงในย่อหน้าข้างต้นใช้เพื่อแยกค่าใหม่จากค่าเดิม

  • "" เป็นพื้นที่ที่ค่า / s อยู่

  • เครื่องหมาย ~ คือโฟลเดอร์บ้าน


ฉันหวังว่าหลังจากทำแผนที่นี้ฉันได้ทำแล้วคำสั่งจะชัดเจนขึ้นสำหรับนักศึกษาใหม่อย่างฉัน


1

exportคำสั่งทำให้ตัวแปรที่มีอยู่ใน subshells กล่าวคือหากไม่มีตัวแปรPATHจะไม่สามารถมองเห็นได้ใน subshells

PATH ถูกกล่าวถึงสองครั้ง:

  • เนื่องจากตัวแปรกำลังถูกกำหนดค่าให้อยู่ทางด้านซ้ายของ=เครื่องหมาย
  • ในฐานะที่เป็นชื่อตัวแปรที่ถูกแทนที่ด้วยค่าที่ถูกต้องของ=เครื่องหมาย สิ่งนี้ทำให้ค่าเก่าเป็นส่วนหนึ่งของค่าใหม่

1
"นั่นคือไม่ว่ามันPATHจะไม่สามารถมองเห็นตัวแปรใน subshells" สิ่งนี้ไม่ถูกต้อง PATHเป็นตัวแปรสภาพแวดล้อม (ซึ่งไม่เหมือนกันกับตัวแปรเชลล์ ) ดังนั้นมันจึงถูกส่งออกโดยอัตโนมัติและexportคำสั่งนั้นไม่จำเป็น
David

ตระกูลเชลล์เป้าหมายไม่ได้แยกความแตกต่างระหว่างตัวแปรเชลล์และสภาพแวดล้อมอย่างแท้จริง ( sc.tamu.edu/help/general/unix/vars.html ) ในระบบของฉัน (Arch Linux) ทุบตีไม่ทราบsetenvคำสั่ง
rexkogitans

1
ยังคงมีความแตกต่างระหว่างตัวแปรสภาพแวดล้อมที่เคอร์เนลรู้และตัวแปรเชลล์ที่อยู่ภายในเพื่อทุบตี เนื่องจากPATHมาจากสภาพแวดล้อมจึงถูกส่งออกโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องเรียกใช้exportการเปลี่ยนแปลงที่จะเผยแพร่สู่กระบวนการลูก
David

ตัวแปรสภาพแวดล้อมไม่ใช่คุณสมบัติของเคอร์เนล แต่เป็นกระบวนการ เนื่องจากกระบวนการที่เรากำลังพูดถึงที่นี่คือ sh, bash (Ubuntu ใช้ zsh หรือไม่) ฉันคิดว่าเราสามารถทำให้พวกเขาเท่าเทียมกับตัวแปรของเชลล์ แต่แน่นอนว่าตัวแปรของเชลล์ไม่ได้ถูกส่งผ่านไปยังโปรแกรมแบบสุ่มใด ๆ เนื่องจากตัวแปรสภาพแวดล้อมคือ
rexkogitans

ฉันคิดว่าเรากำลังจมอยู่กับความหมายในจุดนี้ ทั้งหมดที่ฉันพยายามจะพูดก็คือในทุบตีPATH=fooและexport PATH=fooมีพฤติกรรมที่เหมือนกัน
David

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. exportเป็นคำสั่งที่ Buildin ของทุบตีหมายถึงตัวแปรที่ส่งออกไปจะเป็นตัวแปร envirement (คุณสามารถพิมพ์help exportเพื่อเอนเพิ่มเติม

    (ตัวอักษรที่ทำตามคำสั่งคือพารามิเตอร์แยกด้วยช่องว่างดังนั้นในกรณีนี้มีเพียงพารามิเตอร์เดียวเท่านั้น)

  2. PATHเป็นชื่อตัวแปรปกติ varibale กำหนดไว้ล่วงหน้าโดยทุบตีมีชื่ออยู่ในตัวพิมพ์ใหญ่

  3. =หมายถึงมูลค่าในการกำหนดตัวแปรนี้

  4. สตริงทั้งหมดคือค่าของ varibale

  5. $PATHเป็นชนิดของ funciton ของทุบตีชื่อvariable expantionทุบตีจะแทนที่ค่าของที่มีอยู่ที่PATHในสตริงพารามิเตอร์ก่อนที่จะส่งสตริงexportคำสั่ง

  6. :in the spcial char ในตัวแปร PATH และเข้าใจโดยแอ็พพลิเคชันทั้งหมดที่ต้องการใช้ตัวแปรนี้ มันหมายถึงคั่น ดังนั้นพวกเขาจะมีไดเรกทอรีจำนวนมากในตัวแปร PATH

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.