จะส่งออกตัวแปรจากไฟล์ได้อย่างไร?


80

ฉันมีtmp.txtไฟล์ที่มีตัวแปรที่จะส่งออกตัวอย่างเช่น:

a=123
b="hello world"
c="one more variable"

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


1
bash --init-file somefile.blah -c "command"
Dillian Murphey

ดังนั้นมีคำตอบที่เป็นประโยชน์เกี่ยวกับวิธีการที่มา.envไฟล์โดยอัตโนมัติเมื่อคุณcdเข้าไปในไดเรกทอรี
Dan Dascalescu

@Neerav โปรดยอมรับคำตอบอื่น ๆ นั่นเป็นทางออกที่ดีกว่ามาก
coderDude

คำตอบ:


65
source tmp.txt
export a b c
./child ...

ตัดสินโดยคำถามอื่นของคุณคุณไม่ต้องการ hardcode ชื่อตัวแปร:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

ทดสอบมัน:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
สิ่งนี้จะไม่ทำงานหากไฟล์สภาพแวดล้อมมีความคิดเห็นเช่น (เช่นไฟล์ที่สามารถนำกลับมาใช้โดย systemd ของ EnvironmentFile.)
คริสแกะ

3
@ChrisLamb คุณสามารถใช้grepเพื่อข้ามความคิดเห็น:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

182
set -a
. ./tmp.txt
set +a

set -aทำให้ตัวแปร¹กำหนดจากนี้ไปจะถูกส่งออกโดยอัตโนมัติ มันมีอยู่ในเปลือกคล้ายบอร์นใด ๆ .เป็นชื่อมาตรฐานและบอร์นสำหรับsourceคำสั่งดังนั้นฉันชอบมันสำหรับการพกพา ( sourceมาจากcshและตอนนี้มีอยู่ในเชลล์เหมือนบอร์นที่ทันสมัยที่สุดรวมถึงbashแม้ว่า (บางครั้งมีพฤติกรรมแตกต่างกันเล็กน้อย)

ใน POSIX เชลล์คุณสามารถใช้set -o allexportเป็นทางเลือกที่อธิบายเพิ่มเติมเพื่อเขียน ( set +o allexportเพื่อยกเลิกการตั้งค่า)


¹ในbashระวังว่ามันจะทำให้ฟังก์ชั่นทั้งหมดที่ประกาศในขณะallexportที่จะถูกส่งออกไปยังสภาพแวดล้อม (เป็นBASH_FUNC_myfunction%%ตัวแปรสภาพแวดล้อมที่นำเข้าแล้วโดยbashเชลล์ทั้งหมดที่ทำงานในสภาพแวดล้อมนั้นแม้เมื่อทำงานเป็นsh)


1

แค่ทำ:

while read LINE; do export "$LINE"; done < ./tmp.txt

คุณตรวจสอบว่ามันใช้งานได้หรือไม่
RalfFriedl

@RalfFriedl นี้จะทำงานทำไมไม่? มันไม่ได้หรูหราและการจัดหาด้วยset -aจะง่ายกว่ามาก แต่วิธีนี้ใช้งานได้จริง
terdon

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

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