ฉันจะทำให้ตัวแปรสภาพแวดล้อม“ ส่งออก” ใน shell script ติดรอบได้อย่างไร


54

ฉันมีบัญชี Amazon EC2 หลายบัญชีและต้องการเปลี่ยนตัวแปรอย่างรวดเร็วเช่นการ$EC2_HOMEใช้สคริปต์

ฉันได้ตั้งค่าสคริปต์เชลล์เช่นนี้:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

เมื่อฉันเรียกใช้สคริปต์ฉันรู้ว่าEC2_HOMEมีการตั้งค่า แต่ฉันคิดว่าการใช้exportจะทำให้ตัวแปรติดรอบหลังจากสคริปต์เสร็จสมบูรณ์ มันไม่ได้ทำงานเหมือนecho $EC_HOMEไม่แสดงอะไรเลย

ฉันรู้ว่านี่ต้องเป็นความรู้พื้นฐานเกี่ยวกับการเขียนสคริปต์ Linux แต่ฉันไม่รู้ ฉันพยายามหาคำถามที่เกี่ยวข้องโดยไม่มีโชค - ดังนั้นฉันจึงขอโทษถ้ามันซ้ำกัน

คำตอบ:


60

คุณควรแหล่งสคริปต์ของคุณด้วย

. ./script

หรือ

source ./script

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

1
@glennjackman ผมมีปัญหาที่คล้ายกันและฉันได้พยายามแก้ปัญหาของคุณ แต่มันล็อกฉันออกจากเปลือกเมื่อฉันทำหรือ. sourceทำไมสิ่งนี้จึงเกิดขึ้น
Patryk

7
@ Patryk: สคริปต์ของคุณอาจมีexitคำสั่งดังนั้นจึงไม่เหมาะที่จะหาแหล่งที่มา
enzotib

ในขณะที่source ./scriptผลงานดีอย่างสมบูรณ์กล่าวว่าsudo source ./script.sh sudo: source: command not foundฉันจะทำสิ่งนี้โดยใช้ sudo ได้อย่างไร
71GA

1
@ 71GA: ขึ้นอยู่กับการตั้งค่าสำหรับการรวบรวมsudoและขึ้นอยู่กับการตั้งค่าในคุณสามารถหรือไม่สามารถรักษาสภาพแวดล้อมของคุณเมื่อใช้คำสั่งกับ/etc/sudoers sudoผมขอแนะนำให้คุณลองไปยังแหล่งสคริปต์ของคุณและเรียกใช้sudoมี-Eตัวเลือกในการรักษาสภาพแวดล้อม ถ้ามันไม่ทำงานฉันคิดว่ามีน้อยมากที่คุณสามารถทำได้
enzotib

35

เมื่อคุณเรียกใช้สคริปต์มันจะได้รับเชลล์และสภาพแวดล้อมของมันเองซึ่งจะหายไปอีกครั้งเมื่อสคริปต์เสร็จสิ้น เพื่อให้ตัวแปรสภาพแวดล้อมรอบแหล่งสคริปต์ในเปลือกปัจจุบันของคุณ:

$ source ./a.sh

หรือเท่ากัน (แต่มากกว่าพอร์ทน้อย) ใช้คำสั่ง POSIX dot :

$ . ./a.sh

จากนั้นคำจำกัดความจะถูกใส่ลงในสภาพแวดล้อมของเชลล์ปัจจุบันของคุณและรับมาจากโปรแกรมใด ๆ ที่คุณเรียกใช้จากมัน

เพื่อให้ใกล้เคียงกับการเรียกใช้สคริปต์. a.shจะพบ a.sh โดยค้นหาไดเรกทอรีในPATHตัวแปรสภาพแวดล้อม


มีรายละเอียดปลีกย่อยบางอย่างในลักษณะการทำงานเหล่านี้และไม่ว่าจะเป็น.และsourceเหมือนกัน (หรือปัจจุบันที่ทั้งหมด) . ./a.shจะทำตัวเหมือนกันในทุกเชลล์ที่รองรับ POSIX แต่sourceและ.และ. a.shและและ. ./a.shอาจแตกต่างกัน สำหรับ Bash sourceและ.เหมือนกันในทุกกรณี; สำหรับzsh sourceจะตรวจสอบไดเรกทอรีปัจจุบันแรก ; ksh คล้ายกันมาก

หากชื่อสคริปต์ถูกกำหนดเป็นพา ธ (ประกอบด้วย a /) พา ธ นั้นจะถูกใช้โดยตรงในทุกกรณี สิ่งที่มีความน่าเชื่อถือมากที่สุด portably ทำคือการหรือ. ./script. /path/to/script


1

เพียงเพื่อบันทึก

หากคุณต้องการเรียกใช้สคริปต์จากอินเทอร์เน็ตซึ่งส่งออก env ไปยังระบบ

คุณสามารถใช้รูปแบบต่อไปนี้

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

ตัวอย่างเช่น:

source <(curl -s -L https://example.com/install.sh)

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