วิธีการส่งออกตัวแปรที่ตั้งค่าทั้งหมดในครั้งเดียว?


39

setคำสั่งแสดงตัวแปรท้องถิ่นทั้งหมดดังด้านล่าง ฉันจะส่งออกตัวแปรเหล่านี้ทั้งหมดในครั้งเดียวได้อย่างไร

>set
a=123
b="asd asd"
c="hello world"

คุณหมายถึงการส่งออกทั้งหมดในครั้งเดียว คุณสามารถใช้ semi colons เพื่อกำหนดในหนึ่งบรรทัด ... เช่น a = 123; b = "asd asd"; c = "hello world"
Raza


2
setนอกจากนี้ยังแสดงฟังก์ชั่นและตัวแปรระบบเช่น BASH_VERSION
glenn jackman

คำถามของคุณไม่ชัดเจน นั่นเป็นส่วนที่ตัดตอนมาจากsetเอาต์พุตที่คุณแสดงหรือไม่ ถ้าเป็นเช่นนั้นก็ไม่ได้bash's คุณต้องการส่งออกตัวแปรที่ตั้งค่าทั้งหมดรวมถึงตัวแปรเชลล์พิเศษหรือไม่? หรือเฉพาะ 3 ตัวแปรเช่นในexport a b c?
Stéphane Chazelas

export ${!T*}Tจะส่งออกพารามิเตอร์ที่กำหนดไว้ที่มีชื่อเริ่มต้นด้วย น่าเสียดายที่ดูเหมือนจะไม่มีวิธีในการสร้างรายการพารามิเตอร์ที่กำหนดทั้งหมดได้อย่างง่ายดาย
chepner

คำตอบ:


72

รันคำสั่งต่อไปนี้ก่อนตั้งค่าตัวแปร:

set -a 

หน้าคน:

-a
เมื่อเปิดใช้ตัวเลือกนี้จะมีการตั้งค่าแอตทริบิวต์การส่งออกสำหรับแต่ละตัวแปรที่จะทำการมอบหมาย

หากต้องการปิดตัวเลือกนี้ให้เรียกใช้set +aหลังจากนั้น

ตัวอย่าง:

set -a
. ./environment
set +a

ที่environmentประกอบด้วย:

FOO=BAR
BAS='quote when using spaces'

13
สิ่งนี้จะต้องเปิดใช้งานก่อนที่จะกำหนดให้กับตัวแปร มันไม่ได้ทำอะไรกับตัวแปรที่กำหนดไว้ก่อนหน้านี้
chepner

1
@chepner ขอบคุณฉันลืมพูดถึงเรื่องนั้น !!
nitin

นอกจากนี้ยังส่งออกฟังก์ชั่นโดยอัตโนมัติในลักษณะเดียวกับfunction example(){ echo good; }; export -f example
โอลิเวอร์ฉัน

5
`echo "export" $((set -o posix ; set)|awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}')`
  1. ก่อนอื่นรับตัวแปรสภาพแวดล้อมที่ตั้งไว้ทั้งหมด: (set -o posix ; set) การอ้างอิง: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a- ลินุกซ์-BA

  2. รับชื่อตัวแปรสภาพแวดล้อมทั้งหมดคั่นด้วยช่องว่าง: awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}' การอ้างอิง: awk- การพิมพ์ค่าคอลัมน์โดยไม่มีบรรทัดใหม่และเพิ่มเครื่องหมายจุลภาคและ https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside- awk คำสั่ง

  3. ตอนนี้เราจำเป็นต้องส่งออกตัวแปรเหล่านี้ แต่ xargs ไม่สามารถทำเช่นนี้ได้เพราะมันจะทำให้เกิดกระบวนการลูกการส่งออกจะต้องดำเนินการภายใต้กระบวนการปัจจุบัน echo "export" ...สร้างคำสั่งที่เราต้องการจากนั้นใช้ `` เพื่อเรียกใช้ นั่นคือทั้งหมด: p.


ยินดีต้อนรับสู่ U&L SE บางทีคุณสามารถแก้ไขโพสต์และอธิบายได้
Archemar

1
มันไม่ถูกต้องที่จะสมมติว่าชื่อตัวแปรสภาพแวดล้อมจะมีเพียง az และ AZ เท่านั้น [a-zA-Z_][a-zA-Z0-9_]*พวกเขาโดยทั่วไปจะประกอบด้วยขีดและตัวเลขเช่นกันดังนั้นรูปแบบจะเป็น มีความแตกต่างบางอย่างในเรื่องนี้โดยอิงจากเชลล์ที่คุณใช้ แต่นี่เป็นวิธีที่ปลอดภัย / พกพา
Chris Johnson

Good point @ChrisJohnson - อัปเดต!
Wil Moore III

3

คุณสามารถเติมexportชื่อตัวแปรผ่านawkและevalผลลัพธ์ผลลัพธ์:

eval $(printenv | awk -F= '{ print "export " $1 }')

2
printenvพิมพ์ตัวแปรที่ส่งออกไปแล้ว นอกจากนี้ยังทำงานไม่ถูกต้องหากมีตัวแปรที่มีอักขระขึ้นบรรทัดใหม่
Stéphane Chazelas

2

ใช้งานได้ถ้าเชลล์ของคุณทุบตี (อาจเป็นเชลล์อื่นด้วย)

export > /my/env/var/file

ไฟล์ใหม่ของคุณจะมีดัมพ์ของตัวแปรที่กำหนดไว้ทั้งหมดในปัจจุบัน ... ด้วยรายการที่ชอบ

declare -x PORT="9000"
declare -x PORT_ADMIN="3001"
declare -x PORT_DOCKER_REGISTRY="5000"
declare -x PORT_ENDUSER="3000"
declare -x PRE_BUILD_DIR="/cryptdata6/var/log/tmp/khufu01/loud_deploy/curr/loud-build/hygge"
declare -x PROJECT_ID="hygge"
declare -x PROJECT_ID_BUSHIDO="bushido"

จากนั้นเพื่อแจ็คเชลล์ปัจจุบันด้วยปัญหา env vars ทั้งหมด

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