ตัวแปรสภาพแวดล้อมคืออะไร


42

ฉันรู้ว่าVARIABLE=valueสร้างตัวแปรสภาพแวดล้อมและexport VARIABLE=valueทำให้พร้อมใช้งานสำหรับกระบวนการที่สร้างโดยเชลล์ปัจจุบัน envแสดงตัวแปรสภาพแวดล้อมปัจจุบัน แต่พวกมันอยู่ที่ไหน สิ่งที่ประกอบด้วยตัวแปรสภาพแวดล้อม (หรือสภาพแวดล้อมสำหรับเรื่องนั้น)?

คำตอบ:


29

สภาพแวดล้อมไม่ได้วิเศษเท่าที่ควร เชลล์เก็บไว้ในหน่วยความจำและส่งผ่านไปยังการexecve()เรียกของระบบ environกระบวนการเด็กสืบทอดว่ามันเป็นตัวชี้อาร์เรย์ที่เรียกว่า จากexecvemanpage:

สรุป

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argvคืออาร์เรย์ของสตริงอาร์กิวเมนต์ที่ส่งผ่านไปยังโปรแกรมใหม่
ตามแบบแผนสตริงแรกของสตริงเหล่านี้ควรมีชื่อไฟล์ที่สัมพันธ์กับไฟล์ที่กำลังดำเนินการ envpคืออาร์เรย์ของสตริงตามแบบฟอร์ม key = value ซึ่งส่งผ่านเป็นสภาพแวดล้อมไปยังโปรแกรมใหม่

environ(7)manpage ยังมีความเข้าใจบางอย่าง

สรุป

   extern char **environ;

รายละเอียด

ตัวแปร environชี้ไปที่อาร์เรย์ของพอยน์เตอร์ไปยังสตริงที่เรียกว่า "สภาพแวดล้อม" NULLตัวชี้สุดท้ายในอาร์เรย์นี้มีค่า (ตัวแปรนี้จะต้องประกาศในโปรแกรมผู้ใช้ แต่มีการประกาศในไฟล์ส่วนหัว<unistd.h>ในกรณีที่ไฟล์ส่วนหัวมาจาก libc4 หรือ libc5 และในกรณีที่มาจาก glibc และ _GNU_SOURCE ถูกกำหนด) อาเรย์ของสตริงนี้มีให้ กระบวนการโดยการเรียก exec (3) ที่เริ่มต้นกระบวนการ

GNU ทั้งสองนี้ตรงกับข้อกำหนด POSIX


4
+1 น่าจะเป็นที่น่าสังเกตว่าสมาชิกบางคนในexec(3)ครอบครัว (เช่นที่ไม่ตรงกับ exec * v) ผ่าน ** สภาพแวดล้อมภายใต้ปก
msw

5
โปรดทราบว่ามันไม่เกี่ยวกับกระบวนการลูก (กระบวนการลูกสืบทอดหน่วยความจำทั้งหมดของพาเรนต์) แต่ใช้โปรแกรม (ในกระบวนการเดียวกัน) ดังนั้นจึงเป็นอีกวิธีหนึ่งในการส่งผ่านข้อมูลที่เรียกการเรียกระบบ execve () ของกระบวนการ)
Stéphane Chazelas

@msw: เป็นexec*eตัวแปรที่ส่งผ่าน env อย่างชัดเจนแทนที่จะใช้environตัวแปรโกลบอล vหมายถึง "เวกเตอร์" และหมายถึงอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งผ่านเป็นอาร์เรย์ (แทนที่จะเป็น "รายการ" (ฟังก์ชั่นความยาวตัวแปร)) execveเป็นสายของระบบและอื่น ๆ ทั้งหมดที่exec*ฟังก์ชั่นห่อ libc สำหรับมัน
Peter Cordes

19

คุณได้รับมันผิดเล็กน้อย: SOME_NAME=valueสร้างตัวแปรเชลล์ (ในเชลล์ส่วนใหญ่) export SOME_NAME=valueสร้างตัวแปรสภาพแวดล้อม เพื่อให้ดีขึ้นสำหรับแย่ลงเชลล์ Unix / Linux / * BSD ส่วนใหญ่ใช้ไวยากรณ์ที่เหมือนกันในการเข้าถึงตัวแปรสภาพแวดล้อมและตัวแปรเชลล์

ในความหมายที่กว้างขึ้น "สภาพแวดล้อม" เป็นเพียงข้อมูลที่สอดคล้องกับการดำเนินการของโปรแกรม ในโปรแกรม C, คุณอาจพบว่ากระบวนการ ID ที่มีการโทรในโปรแกรมเปลือกที่คุณจะใช้เข้าถึงตัวแปร:getpid() $$ID กระบวนการเป็นเพียงส่วนหนึ่งของสภาพแวดล้อมของโปรแกรม ฉันเชื่อว่าคำว่า "สภาพแวดล้อม" นั้นมาจากหัวข้อทางวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีมากกว่าเช่นการสร้างโปรแกรมแบบจำลอง .. แบบจำลองการทำงานของโปรแกรมมีสภาพแวดล้อม "ซึ่งมีความสัมพันธ์ระหว่างตัวแปรและค่านิยม"

และคำจำกัดความที่แข็งแกร่งกว่านี้คือสิ่งที่ "สภาพแวดล้อม" สำหรับเชลล์ Unix / Linux / * BSD: การเชื่อมโยงระหว่างชื่อ ("ตัวแปร") และค่าของมัน สำหรับเชลล์สไตล์ Unix ส่วนใหญ่ค่าต่างๆจะเป็นสตริงอักขระทั้งหมดแม้ว่าจะไม่เป็นจริงอย่างที่เคยเป็นมา Ksh, Zsh และ Bash ต่างก็พิมพ์ตัวแปรในทุกวันนี้ แม้แต่นิยามฟังก์ชันเชลล์สามารถส่งออกได้

การใช้สภาพแวดล้อมที่แยกจากตัวแปรเชลล์ธรรมดาเกี่ยวข้องกับfork/execวิธีการเริ่มกระบวนการใหม่ที่ใช้ Unixes ทั้งหมด เมื่อคุณexportคู่ชื่อ / ค่าคู่ชื่อ / ค่านั้นจะปรากฏในสภาพแวดล้อมของการปฏิบัติการใหม่เริ่มต้นโดยเชลล์ด้วยการexecve(2)เรียกระบบ (มักจะต่อไปนี้fork(2)ยกเว้นเมื่อมีการใช้execคำสั่งเชลล์)

ต่อไปนี้execve()การmain()ทำงานของไบนารีใหม่ที่มีอาร์กิวเมนต์บรรทัดคำสั่งของสภาพแวดล้อม (เก็บไว้เป็นอาร์เรย์โมฆะสิ้นสุดของตัวชี้ไปยังvar=valueสตริงดูenviron(7)หน้าคน) สถานะอื่นที่สืบทอดมาประกอบด้วยulimitการตั้งค่าไดเรกทอรีการทำงานปัจจุบันและตัวอธิบายไฟล์แบบเปิดใด ๆ ที่execve()ผู้เรียกไม่ได้ตั้งค่า FD_CLOEXEC ไว้ สถานะปัจจุบันของ tty (เปิดใช้งาน echo โหมด raw เป็นต้น) อาจถูกพิจารณาว่าเป็นส่วนหนึ่งของสถานะการเรียกใช้ที่สืบทอดโดยexecกระบวนการใหม่

ดูbashคำอธิบายของสภาพแวดล้อมการดำเนินการด้วยตนเองสำหรับคำสั่งง่ายๆ (นอกเหนือจากฟังก์ชั่น builtin หรือ shell)

สภาพแวดล้อม Unix นั้นแตกต่างจากระบบปฏิบัติการอื่นอย่างน้อยบางระบบ: VMS "lexicals" สามารถเปลี่ยนแปลงได้โดยกระบวนการลูกและการเปลี่ยนแปลงนั้นสามารถมองเห็นได้ในพาเรนต์ VMS cdในกระบวนการลูกจะมีผลต่อไดเรกทอรีทำงานของผู้ปกครอง อย่างน้อยในบางสถานการณ์และความทรงจำของฉันอาจทำให้ฉันล้มเหลว

บางตัวแปรสภาพแวดล้อมที่เป็นที่รู้จักกันดี$HOME, $PATH, $LD_LIBRARY_PATHและอื่น ๆ ps -efบางคนมีการชุมนุมเพื่อระบบการเขียนโปรแกรมที่กำหนดเพื่อให้เปลือกปกครองสามารถผ่านจำนวนมากและจำนวนของข้อมูลที่มีวัตถุประสงค์พิเศษในการเขียนโปรแกรมบางอย่างเช่นไดเรกทอรีชั่วคราวที่เฉพาะเจาะจงหรือรหัสผู้ใช้และรหัสผ่านที่จะไม่แสดงขึ้นใน โปรแกรม CGI ง่าย ๆ ได้รับข้อมูลจำนวนมากจากเว็บเซิร์ฟเวอร์ผ่านตัวแปรสภาพแวดล้อมตัวอย่างเช่น


1
ดูเหมือนว่ามันจะซับซ้อนกว่านี้เล็กน้อย อย่างน้อยใน bash SOME_NAME=value commandจะตั้งค่าตัวแปรสภาพแวดล้อม SOME_NAME สำหรับการเรียกใช้คำสั่งนั้น ดูเหมือนว่าจะไม่ตั้งค่าตัวแปรเชลล์ในชื่อเดียวกัน
Samuel Edwin Ward

2
เพื่อความแม่นยำมากขึ้นตัวแปรสภาพแวดล้อมจะไม่ได้รับการสืบทอด แต่ผ่านอย่างชัดเจนจากเชลล์ไปยังโปรแกรมที่วางไข่
msw

2
@SamuelEdwinWard เหตุผลที่SOME_NAME=value commandพฤติกรรมของคุณขัดกับความคาดหวังของคุณคือมันเป็นความหมายของไวยากรณ์พิเศษ "เพิ่ม SOME_NAME ให้กับสภาพแวดล้อมที่ส่งผ่านไปยังคำสั่ง แต่อย่าเปลี่ยนแปลงตัวแปรของเชลล์นี้"
msw

1
ที่น่าสนใจลิงค์ไปยังแคลคูลัสแลมบ์ดา / การเขียนโปรแกรมเชิงฟังก์ชัน นั่นคือการเชื่อมต่อที่น่าสนใจซึ่งมีเหตุผลมากมาย
Matt

1
บางอย่างนี้ไม่ถูกต้องนัก ตัวอย่างเช่น subshells เป็นกระบวนการย่อยและต้องเป็นfork()ed แต่จะได้รับ (สำเนา) ตัวแปรเชลล์
ruakh

7

ตัวแปรสภาพแวดล้อมในรูปแบบดิบที่สุดเป็นเพียงชุดคู่ชื่อ / ค่า ตามที่อธิบายไว้ในหน้า bash man ( man 1 bash) ภายใต้หัวข้อสภาพแวดล้อม:

   When  a  program  is invoked it is given an array of strings called the
   environment.   This  is  a  list  of  name-value  pairs,  of  the  form
   name=value.

   The  shell  provides  several  ways  to manipulate the environment.  On
   invocation, the shell scans its own environment and creates a parameter
   for  each name found, automatically marking it for export to child pro-
   cesses.  Executed commands inherit the  environment.

ในแง่การปฏิบัติจะช่วยให้คุณกำหนดพฤติกรรมที่ใช้ร่วมกันหรือไม่ซ้ำกับโปรแกรมที่เรียกใช้จากเชลล์ปัจจุบัน ตัวอย่างเช่นเมื่อใช้crontabหรือvisudoคุณสามารถกำหนดEDITORตัวแปรสภาพแวดล้อมเพื่อกำหนดโปรแกรมแก้ไขอื่นนอกเหนือจากที่ระบบของคุณจะใช้เป็นค่าเริ่มต้น เช่นเดียวกันสามารถจัดขึ้นจริงสำหรับสิ่งต่าง ๆ เช่นmanคำสั่งซึ่งมองที่PAGERสภาพแวดล้อมของคุณเพื่อหาว่าโปรแกรมเพจเจอร์ควรใช้อะไรเพื่อแสดงผลลัพธ์ของ man page ด้วย

คำสั่ง unix ค่อนข้างมากอ่านสภาพแวดล้อมและขึ้นอยู่กับสิ่งที่ตั้งไว้ที่นั่นเปลี่ยนเอาท์พุท / การประมวลผล / การกระทำของพวกเขา บางคนใช้ร่วมกันบางอย่างเป็นเอกลักษณ์ของโปรแกรม หน้าคนส่วนใหญ่มีข้อมูลเกี่ยวกับวิธีที่ตัวแปรสภาพแวดล้อมมีผลกับโปรแกรมที่อธิบายไว้

ภาพประกอบเชิงปฏิบัติอื่น ๆ สำหรับสิ่งต่าง ๆ เช่นระบบที่มีการติดตั้ง Oracle จำนวนมากบนแพลตฟอร์มเดียวกัน โดยการตั้งค่าORACLE_HOMEชุดคำสั่ง oracle ทั้งหมด (โหลดจากPATHตัวแปรสภาพแวดล้อมของคุณ) จากนั้นดึงการตั้งค่าคำจำกัดความการแมปและไลบรารีจากภายใต้ไดเรกทอรีระดับบนสุดนั้น การพักที่เหมือนกันจริงสำหรับโปรแกรมอื่น ๆ เช่น java พร้อมกับJAVA_HOMEตัวแปรสภาพแวดล้อม

bash เองมีตัวแปรสภาพแวดล้อมมากมายซึ่งสามารถเปลี่ยนพฤติกรรมของช่วงของสิ่งต่าง ๆ จากประวัติ ( HISTSIZE, HISTFILEฯลฯ ), ขนาดหน้าจอ ( COLUMNS), การเติมแท็บ ( FIGNORE, GLOBIGNORE) โลแคลและการเข้ารหัส / ถอดรหัสอักขระ ( LANG, LC_*), พร้อมท์ ( PS1.. PS4) และ อื่น ๆ (ค้นหาความรู้จากหน้า bash man อีกครั้ง)

นอกจากนี้คุณสามารถเขียนสคริปต์ / โปรแกรมที่ใช้ประโยชน์จากตัวแปรสภาพแวดล้อมแบบกำหนดเองของคุณ (เพื่อผ่านการตั้งค่าหรือเปลี่ยนการทำงาน)


0

"ตัวแปรสภาพแวดล้อม"เป็นชุดของค่าที่ตั้งชื่อแบบไดนามิกซึ่งอาจส่งผลต่อวิธีการที่กระบวนการทำงานจะทำงานบนคอมพิวเตอร์

พวกเขาเป็นส่วนหนึ่งของสภาพแวดล้อมการทำงานที่กระบวนการทำงาน ตัวอย่างเช่นกระบวนการที่กำลังทำงานสามารถสอบถามค่าของตัวแปรสภาพแวดล้อม TEMP เพื่อค้นหาตำแหน่งที่เหมาะสมในการจัดเก็บไฟล์ชั่วคราวหรือตัวแปร HOME หรือ USERPROFILE เพื่อค้นหาโครงสร้างไดเรกทอรีที่ผู้ใช้กำลังดำเนินการอยู่

ข้อมูลเพิ่มเติมที่นี่→การhttp://en.wikipedia.org/wiki/Environment_variable

ทุกสิ่งที่คุณอยากรู้เกี่ยวกับตัวแปรสภาพแวดล้อม ... ↑


1
แม้ว่ามันจะไม่น่าเป็นไปได้ว่าลิงก์นี้จะหายไป แต่ก็เป็นการดีกว่าที่จะตอบคำถามด้วยข้อความที่เกี่ยวข้องและให้ลิงค์เป็นการเพิ่มข้อมูลสำรอง
Anthon

@ ทันใดนั้นฉันเชื่อว่าคุณถูกต้องและฉันจะทำการเปลี่ยนแปลงโดยเร็วที่สุดเท่าที่ฉันสามารถทำได้ ... ขอบคุณสำหรับคำแนะนำ ...
SoCalDiegoRob

-1

คำตอบนี้ต้องการประสบการณ์การเขียนสคริปต์เชลล์และความรู้ด้วยตัวแปรเงื่อนไข, ค่า, การทดแทนตัวแปร, พรอมต์, echo, เคอร์เนล, เชลล์, ยูทิลิตี้, เซสชันและกระบวนการ

ตัวแปรสภาพแวดล้อม (envar) เป็นชุดของตัวแปรที่กำหนดไว้ทั่วโลกที่มีผลกระทบต่อวิธีการกระบวนการที่กำหนดจะทำงานบนระบบปฏิบัติการของเครื่องคอมพิวเตอร์ได้

1. การแนะนำที่เป็นแบบอย่าง:

เราแทน envars ด้วย$และอักษรตัวพิมพ์ใหญ่ ตัวอย่างเช่น$PS1.

เราสามารถพิมพ์ envar ด้วยวิธีนี้:

echo $PS1

$PS1เก็บค่าของพรอมต์ Unix \u \w $บอกว่าค่าพื้นเมืองที่มี

  • \u ย่อมาจากผู้ใช้ (ปัจจุบัน)
  • \w ย่อมาจากไดเรกทอรีทำงาน
  • $ คือการพรอมต์ให้กับเส้นขอบ

ดังนั้นถ้าเรา: echo $PS1เราจะเห็นค่าของ\u, \wบวกเงินดอลลาร์ในท้ายที่สุด

เราสามารถเปลี่ยนพฤติกรรม Unix ในบริบทนั้นถ้าเราเปลี่ยนค่าของ envar นั้น ตัวอย่างเช่น:

PS1="\w >"

ตอนนี้พรอมต์จะเป็นดังนี้ (สมมติว่าไดเร็กตอรี่ทำงานชื่อ "John"):

John >

ในลักษณะเดียวกับที่เราสามารถทำได้PS1="Hello, I'm your prompt >"ดังนั้นecho $PS1จะนำมาซึ่ง:

Hello, I'm your prompt >

ใน Bash 4.xx เราสามารถพิมพ์ envars ทั้งหมดในระบบด้วยenvคำสั่ง ฉันขอแนะนำให้ดำเนินการenvใน terminal และดูที่ผลลัพธ์

2. ข้อมูลเหล่านี้มีการแสดงและจัดการอย่างไร:

เทอร์มินัลของเซสชันให้เราปรับแต่ง envars ที่มาพร้อมกับ Bash

การเปลี่ยนแปลงดังกล่าวมักเกิดขึ้นชั่วคราวและนี่คือสาเหตุ:

แต่ละเซสชั่น (ซึ่งไม่ใช่เซสชั่นย่อย) เป็นเอกลักษณ์และกระบวนการหลายอย่างสามารถทำงานได้อย่างไม่ซ้ำกันในเวลาเดียวกัน (แต่ละชุดมี envars ของตัวเอง) แต่โดยปกติจะมีการสืบทอดจากเซสชัน 0 ถึงเซสชัน 1 ขึ้นไป

การเปลี่ยนแปลงที่เราทำกับกระบวนการหนึ่งนั้นไม่เหมือนใครและจะหยุดลงถ้าเราปิดมันโดยไม่บันทึกในบางวิธี

ดังนั้นเราจะบันทึกการเปลี่ยนแปลงเหล่านี้ได้อย่างไร:

มีหลายวิธีในการจัดเก็บการเปลี่ยนแปลง envar ขึ้นอยู่กับขอบเขตที่เราเลือก นี่คือขอบเขต (ระดับ) ที่แตกต่างกันสำหรับการเปลี่ยนแปลงดังกล่าว:

  • ระดับกระบวนการ: envars ใช้ได้เฉพาะกับโปรแกรมในเซสชันปัจจุบันเท่านั้น
  • ระดับการส่งออกที่: envars ที่ใช้ได้สำหรับโปรแกรมในเซสชั่นปัจจุบันหรือทั้งหมดของการประชุมย่อย
  • ระดับโลก: การเปลี่ยนแปลงจะถูกเก็บไว้สำหรับทุกเซสชันใด ๆ (หลักและย่อยทั้งหมด)

ข้อมูล envar ถูกเก็บไว้ที่ไหน:

Unix สร้างขึ้นจาก 3 เลเยอร์หลัก: เคอร์เนล, เชลล์และยูทิลิตี้ AFAIK แต่ละเชลล์มี envars ของตัวเองและสิ่งเหล่านี้ถูกสร้างขึ้นเป็นหลักหรือเฉพาะในเปลือก

ตำแหน่งเฉพาะที่จะเปลี่ยนแปลงระดับโลกเหล่านี้มักจะเป็น/etc/profileแม้ว่าเราสามารถทำเช่นนั้นได้.bashrcแน่นอน

3. การสร้าง envars ใหม่:

เราสามารถสร้าง envars ใหม่และนี่คือวิธี ณ Bash 4.xx นั้นไม่มี enavar พื้นเมืองชื่อMESSAGE(ดังที่กล่าวว่า envars มักจะเป็นตัวพิมพ์ใหญ่)

MESSAGE="Hello world!"

จะสร้างมันขึ้นมาสำหรับเราและตอนนี้ถ้าเราพิมพ์สะท้อนที่เราได้รับ$MESSAGEhello world!

ถ้าเราจะดำเนินการbashในเซสชั่นการทำงานของเราในปัจจุบัน (หน้าต่าง) exitเราจะเริ่มต้นใหม่ทุบตีย่อยเซสชั่นและจะไม่ทำงานในกระบวนการเดิมเว้นแต่ว่าเราดำเนินการ

หมายเหตุ: ในระบบปฏิบัติการที่มีเทอร์มินัลอีมูเลเตอร์ (เช่นเดสก์ท็อป Ubuntu) เซสชันย่อยมักจะทำงานบนหน้าต่างเดียวกัน แต่เซสชันใหม่ในหน้าต่างอื่นไม่ใช่เซสชันย่อยของเซสชันที่มีอยู่ (เป็นกระบวนการที่อยู่ติดกัน ) .

หมายเหตุ: อย่าใช้เครื่องหมายพิเศษในค่าของ envar เช่น! มิฉะนั้นพวกเขาจะไม่ถูกบันทึก

การส่งออก envar จากเซสชันต้นฉบับไปยังเซสชันย่อยทั้งหมด:

เรายังคงสามารถใช้ envar ที่สร้างขึ้นในเซสชั่นแรกในเซสชั่นที่สองเช่นกันโดยไม่ต้องลงทะเบียนในไฟล์ผู้ใช้หรือไฟล์ระดับโลก conf (ดูข้อมูลต่อไปนี้) นี่คือวิธีการทำ:

ไปที่เซสชั่นเดิม (ไม่ว่าจะในหน้าต่างปัจจุบันหรืออื่น) และดำเนินการ:

export MESSAGE

เมื่อส่งออกอย่าใช้$เครื่องหมาย

ขณะนี้จะถูกส่งออกไปยังเซสชันย่อยทั้งหมด หากคุณทำecho $MESSAGEในเซสชันย่อยไม่ว่าจะจากผู้ใช้ของคุณหรือจากนั้นก็จะถูกพิมพ์

โปรดทราบว่าเชลล์ตัวแปรภายในเช่นPS1ไม่ควรที่จะส่งออก แต่ถ้าคุณไม่ต้องการที่จะส่งออกจากเหตุผลใดและพวกเขาจะไม่ปรากฏไม่ได้ดำเนินการbashหลังจากที่แต่exportbash –norc

4. การติดตาม $ PATH:

$PATH เป็น envar ที่ผู้ใช้มักจะเปลี่ยนมากที่สุด

ถ้าเราecho $PATHเราจะเห็นกระแสนี้:

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

ค่าที่พิมพ์ของ envar นี้ถูกคั่นด้วยเครื่องหมายทวิภาค (:) ตรงนั้น แต่นี่อาจเป็นวิธีที่สะดวกสบายกว่า (นี่คือค่าเดียวกัน ):

/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games

นี่คือ direcotries เพื่อค้นหาเมื่อเราเรียกใช้โปรแกรมอรรถประโยชน์

โดยการดำเนินการwhich echoที่เราจะได้รับตำแหน่งแฟ้มของ - /bin/echoตัวอย่างเช่นเราอาจจะเห็นว่ามันมีอยู่ใน

ตามที่เราไม่ต้องพิมพ์ echo envar เพื่อดูค่าของ evnar เรายังสามารถทำ:

/bin/echo $ENVAR

Envar จะยังคงทำงานเช่น:

/bin/echo $HOME

ให้เรา

/home/User || /root

เช่นเดียวกับ:

echo $HOME

ให้เรา

/home/User || /root

หมายเหตุ: มีการเรียกโดยย่อว่า$HOME~

ความสัมพันธ์ของระบบ - $ PATH และการโต้ตอบกับผู้ใช้ที่เป็นไปได้:

ใน Bash 4.xx เมื่อเราใช้ยูทิลิตีที่ไม่มีพา ธ เต็มระบบจะใช้ค่าทั้งหมด 6 ค่าที่กล่าวถึงข้างต้นของ$PATHenvar ดังนั้นมันจะเริ่มจาก/user/local/binและจะติดตามเนื้อหาทั้งหมดของมันเพื่อค้นหาechoไฟล์ที่เรียกใช้งานได้

ในกรณีนี้มันจะหยุดที่/bin/echoซึ่งในกรณีนี้การปฏิบัติการอยู่

ดังนั้นเหตุผลหลักที่เราอาจปรับแต่งค่า$PATHenvar ก็คือการติดตั้งโปรแกรมที่ไม่ได้อยู่ในค่าดั้งเดิม

หลังจากติดตั้งโปรแกรมปฏิบัติการดังกล่าวเราควรตั้ง$PATHค่าให้เหมาะสมแล้วเราจะสามารถทำงานกับมันได้

5. ภาคผนวก - การขยาย$PATH:

เราสามารถexport $PATHทุบตีเซสชันย่อย (ซึ่งรวมถึงส่วนขยาย bash เช่น WP-CLI สำหรับ WordPress หรือ Drush สำหรับ Drupal) ด้วยวิธีนี้:

export PATH="/home/John:$PATH"

นี้จะเพิ่มค่าใหม่/home/Johnไป$PATHแล้วคลิกขวาหลังจากนั้นก็จะยึดค่าพื้นเมืองใด ๆ กับมัน (ขวาหลังจากลำไส้ใหญ่) $PATHซึ่งจะถูกเก็บไว้ภายใต้ไวยากรณ์

การเปลี่ยนแปลงอย่างถาวรดังกล่าวสามารถทำได้ในสคริปต์ที่เกี่ยวข้องมักจะต่ำกว่าและโดยชื่อ/etc/profile.bashrc


3
คำตอบนี้มีข้อผิดพลาดมากมายอันน่าสะพรึงกลัว: การรวมกันของเซสชันและกระบวนการเตือนเกี่ยวกับ!ค่าตัวแปรสภาพแวดล้อมที่ไม่ทำงานด้านล่างตัวอย่างที่แสดงว่ามันทำงานความคิดที่ผิดพลาดของเซสชันย่อยค่อนข้างคำแนะนำที่แปลกประหลาดเกี่ยวกับสิ่งที่ต้องทำ หลังจากส่งออกตัวแปรเชลล์และความคิดที่ผิดพลาดของตัวแปรสภาพแวดล้อมโกลบอล
JdeBP

warning about ! in an environment variable value not working that is right below an example showing it working? กรุณายกตัวอย่าง
JohnDoea

quite bizarre advice about what to do after exporting a shell variableคุณหมายถึงอะไรกันแน่
JohnDoea

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