ตัวแปรสภาวะแวดล้อมไม่สามารถเข้าถึงได้ในสคริปต์ทุบตี


22

ฉันพบปัญหาแปลก ๆ ฉันใส่ตัวแปร env ลงไป.bashrcและทำงานได้ตามที่ควร:

echo $HADOOP_HOME
/home/me/dist/hadoop

แต่ตัวแปร env ไม่สามารถเข้าถึงได้เมื่อเรียกใช้งานสคริปต์ bash สมมติว่าฉันสร้าง/tmp/sample.shด้วยเนื้อหาด้านล่าง:

#! /bin/bash
echo $HADOOP_HOME

เมื่อฉันเรียกใช้สคริปต์ข้างต้นก้องบรรทัดว่างเปล่า:

/tmp/sample.sh
   

1
คุณสามารถแสดงส่วนที่เกี่ยวข้องของคุณ.bashrc? ฉันเดาว่าคุณไม่ได้กำลังexport: export HADOOP_HOME=/home/me/dist/hadoopเมื่อคุณรัน/tmpsample.sh` (ซึ่งวางไข่ใหม่bashด้วยสภาพแวดล้อมใหม่) HADOOP_HOME ไม่ได้อยู่ในสภาพแวดล้อมใหม่
John N

คำตอบ:


29

นั่นเป็นเพราะHADOOP_HOMEตัวแปรไม่ได้ถูกส่งออก:

$ cat foo.sh
#!/bin/bash
echo "HADOOP_HOME: $HADOOP_HOME"


$ HADOOP_HOME=/home/me/dist/hadoop
$ echo $HADOOP_HOME
/home/me/dist/hadoop

$ foo.sh
HADOOP_HOME: 

$ export HADOOP_HOME
$ foo.sh
HADOOP_HOME: /home/me/dist/hadoop

เมื่อคุณเรียกใช้เชลล์สคริปต์สคริปต์นั้นจะทำงานในอินสแตนซ์ทุบตีของตัวเอง (นั่นคือสิ่งที่#!/bin/bashทำ) ที่เป็นเชลล์ลูกของเชลล์ปัจจุบัน ตัวแปรจะไม่ถูกส่งผ่านไปยังเปลือกลูกโดยค่าเริ่มต้นเฉพาะในกรณีที่พวกเขาถูกส่งออก คิดว่าแต่ละเซสชันทุบตีเป็นอิสระ (พวกเขาส่วนใหญ่) โดยปกติคุณไม่ต้องการให้ตัวแปรที่กำหนดไว้ในที่หนึ่งสร้างมลพิษให้กับสภาพแวดล้อมของคนอื่น exportสำหรับกรณีที่ว่ามีความจำเป็นต้องใช้

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