คำตอบนี้ต้องการประสบการณ์การเขียนสคริปต์เชลล์และความรู้ด้วยตัวแปรเงื่อนไข, ค่า, การทดแทนตัวแปร, พรอมต์, 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!"
จะสร้างมันขึ้นมาสำหรับเราและตอนนี้ถ้าเราพิมพ์สะท้อนที่เราได้รับ$MESSAGE
hello world!
ถ้าเราจะดำเนินการbash
ในเซสชั่นการทำงานของเราในปัจจุบัน (หน้าต่าง) exit
เราจะเริ่มต้นใหม่ทุบตีย่อยเซสชั่นและจะไม่ทำงานในกระบวนการเดิมเว้นแต่ว่าเราดำเนินการ
หมายเหตุ: ในระบบปฏิบัติการที่มีเทอร์มินัลอีมูเลเตอร์ (เช่นเดสก์ท็อป Ubuntu) เซสชันย่อยมักจะทำงานบนหน้าต่างเดียวกัน แต่เซสชันใหม่ในหน้าต่างอื่นไม่ใช่เซสชันย่อยของเซสชันที่มีอยู่ (เป็นกระบวนการที่อยู่ติดกัน ) .
หมายเหตุ: อย่าใช้เครื่องหมายพิเศษในค่าของ envar เช่น! มิฉะนั้นพวกเขาจะไม่ถูกบันทึก
การส่งออก envar จากเซสชันต้นฉบับไปยังเซสชันย่อยทั้งหมด:
เรายังคงสามารถใช้ envar ที่สร้างขึ้นในเซสชั่นแรกในเซสชั่นที่สองเช่นกันโดยไม่ต้องลงทะเบียนในไฟล์ผู้ใช้หรือไฟล์ระดับโลก conf (ดูข้อมูลต่อไปนี้) นี่คือวิธีการทำ:
ไปที่เซสชั่นเดิม (ไม่ว่าจะในหน้าต่างปัจจุบันหรืออื่น) และดำเนินการ:
export MESSAGE
เมื่อส่งออกอย่าใช้$
เครื่องหมาย
ขณะนี้จะถูกส่งออกไปยังเซสชันย่อยทั้งหมด หากคุณทำecho $MESSAGE
ในเซสชันย่อยไม่ว่าจะจากผู้ใช้ของคุณหรือจากนั้นก็จะถูกพิมพ์
โปรดทราบว่าเชลล์ตัวแปรภายในเช่นPS1
ไม่ควรที่จะส่งออก แต่ถ้าคุณไม่ต้องการที่จะส่งออกจากเหตุผลใดและพวกเขาจะไม่ปรากฏไม่ได้ดำเนินการbash
หลังจากที่แต่export
bash –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 ค่าที่กล่าวถึงข้างต้นของ$PATH
envar ดังนั้นมันจะเริ่มจาก/user/local/bin
และจะติดตามเนื้อหาทั้งหมดของมันเพื่อค้นหาecho
ไฟล์ที่เรียกใช้งานได้
ในกรณีนี้มันจะหยุดที่/bin/echo
ซึ่งในกรณีนี้การปฏิบัติการอยู่
ดังนั้นเหตุผลหลักที่เราอาจปรับแต่งค่า$PATH
envar ก็คือการติดตั้งโปรแกรมที่ไม่ได้อยู่ในค่าดั้งเดิม
หลังจากติดตั้งโปรแกรมปฏิบัติการดังกล่าวเราควรตั้ง$PATH
ค่าให้เหมาะสมแล้วเราจะสามารถทำงานกับมันได้
5. ภาคผนวก - การขยาย$PATH
:
เราสามารถexport $PATH
ทุบตีเซสชันย่อย (ซึ่งรวมถึงส่วนขยาย bash เช่น WP-CLI สำหรับ WordPress หรือ Drush สำหรับ Drupal) ด้วยวิธีนี้:
export PATH="/home/John:$PATH"
นี้จะเพิ่มค่าใหม่/home/John
ไป$PATH
แล้วคลิกขวาหลังจากนั้นก็จะยึดค่าพื้นเมืองใด ๆ กับมัน (ขวาหลังจากลำไส้ใหญ่) $PATH
ซึ่งจะถูกเก็บไว้ภายใต้ไวยากรณ์
การเปลี่ยนแปลงอย่างถาวรดังกล่าวสามารถทำได้ในสคริปต์ที่เกี่ยวข้องมักจะต่ำกว่าและโดยชื่อ/etc/profile
.bashrc
exec(3)
ครอบครัว (เช่นที่ไม่ตรงกับ exec * v) ผ่าน ** สภาพแวดล้อมภายใต้ปก