bash-builtins 'set' และ 'export' ทำอะไรได้บ้าง


46

ฉันมีการสูญเสียเล็กน้อยตามวัตถุประสงค์setและexportใน Bash (และฉันก็เดาว่าอาจเป็นหอยอื่นด้วย)

ฉันคิดว่ามันเป็นการตั้งค่าตัวแปรสภาพแวดล้อม แต่สามารถทำได้ด้วยVARIABLE=VALUEใช่ไหม

พิมพ์setและexportแสดงค่าที่แตกต่างด้วยตัวเอง

ดังนั้นวัตถุประสงค์ของพวกเขาคืออะไร?


ดูเพิ่มเติมที่: unix.stackexchange.com/questions/3507/…
lesmana

ฉันมักจะเริ่มต้นด้วยการทุบตีสคริปต์กับสองต่อไปนี้ #! / usr / bin / env bash set -euxo pipefail ลิงก์นี้อธิบายได้อย่างสวยงาม coderwall.com/p/fkfaqq/…
147.3k

คำตอบ:


50

exportส่งออกไปยังลูกของกระบวนการปัจจุบันโดยค่าเริ่มต้นพวกเขาจะไม่ส่งออก ตัวอย่างเช่น:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

setในทางกลับกันตั้งค่าคุณลักษณะของเชลล์ตัวอย่างเช่นพารามิเตอร์ตำแหน่ง

$ set foo=baz
$ echo "$1"
foo=baz

โปรดทราบbazว่าไม่ได้รับมอบหมายfooมันจะกลายเป็นพารามิเตอร์ตำแหน่งตามตัวอักษร มีสิ่งอื่น ๆ อีกมากมายsetสามารถทำ (ส่วนใหญ่เปลือกตัวเลือก) help setดู

สำหรับการพิมพ์exportเรียกว่าไม่มีข้อโต้แย้งพิมพ์ตัวแปรทั้งหมดในสภาพแวดล้อมของเปลือก setพิมพ์ตัวแปรที่ไม่ได้ถูกส่งออกด้วย นอกจากนี้ยังสามารถส่งออกวัตถุอื่น ๆ บาง (แม้ว่าคุณควรทราบว่านี้ไม่ได้พกพา) help exportดู


ขอบคุณที่เป็นคำตอบที่มีประโยชน์มาก อย่างไรก็ตามเมื่อฉันตั้งค่า http_proxy เฉพาะกับ http_proxy = abc.comมันจะปรากฏให้เห็นกับกระบวนการลูกเช่นทำงาน wget โดยที่ฉันไม่ส่งออก สิ่งนี้จะเป็นอย่างไร
mydoghasworms

2
@mydoghasworms สองเหตุผลที่เป็นไปได้ foo=bar commandหนึ่งคุณกำลังเรียกใช้คำสั่งเป็น นี่เป็นการส่งออกโดยนัยสำหรับคำสั่งเดียว ความเป็นไปได้ที่สองคือhttp_proxyมันถูกเอ็กซ์พอร์ตในสภาวะแวดล้อมของคุณก่อนที่คุณจะแก้ไข
Chris Down

อ่าใช่คุณพูดถูก ยอดเยี่ยมขอบคุณ!
mydoghasworms

6

See help set: set ใช้เพื่อตั้งค่าแอ็ตทริบิวต์เชลล์และแอ็ตทริบิวต์ตำแหน่ง

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

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