ความแตกต่างระหว่าง“ a = b” และ“ ส่งออก a = b” ใน bash


50

ความแตกต่างระหว่าง:

a=b

และ

export a=b

ในทุบตี?

ฉันเข้าใจว่าพวกเขาทั้งสองกำหนดตัวแปรสภาพแวดล้อม แต่ฉันไม่เข้าใจความแตกต่างอย่างเต็มที่


มีคนช่วยแก้ไขได้ไหม สิ่งนี้ไม่เกี่ยวข้องกับ Linux แต่ขึ้นอยู่กับเชลล์ที่คุณใช้เท่านั้น ฉันเดาว่ามันทุบตีที่นี่ซึ่งใช้งานได้กับ Windows
innaM

ฉันยืนแก้ไขแล้ว
Adam Matan

คำตอบ:


54

export เผยแพร่ตัวแปรไปยังกระบวนการย่อย

ตัวอย่างเช่นถ้าคุณทำ

FOO=bar

ดังนั้นกระบวนการย่อยที่ตรวจสอบ FOO จะไม่พบตัวแปรในขณะนั้น

export FOO=bar

จะอนุญาตให้กระบวนการย่อยค้นหาได้

แต่ถ้าFOOมีการกำหนดไว้แล้วว่าเป็นตัวแปรสภาพแวดล้อมจากนั้นFOO=barจะแก้ไขค่าของตัวแปรสภาพแวดล้อมนั้น

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

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

เชลล์ที่เก่ากว่าไม่รองรับexport FOO=barไวยากรณ์ FOO=bar; export FOOคุณต้องเขียน


33
ที่จริงแล้วถ้าคุณไม่ได้ใช้ " export" คุณจะไม่ได้กำหนดตัวแปรสภาพแวดล้อม แต่เป็นเพียงตัวแปรเชลล์ ตัวแปรเชลล์พร้อมใช้งานสำหรับกระบวนการเชลล์เท่านั้น ตัวแปรสภาพแวดล้อมที่มีอยู่เพื่อใด ๆกระบวนการที่ตามมาไม่ได้เป็นเพียงเปลือกหอย นอกจากนี้ subshells เป็นคำสั่งที่อยู่ในวงเล็บซึ่งมีการเข้าถึงตัวแปรเชลล์ในขณะที่สิ่งที่คุณกำลังพูดถึงคือกระบวนการลูกที่เกิดขึ้นเป็นเชลล์
wfaulk

เก็บไว้ที่ไหน
HDave

28

หากคุณไม่ได้ใช้exportคุณจะไม่ได้กำหนดตัวแปรสภาพแวดล้อม เพียงตัวแปรเชลล์

ตัวแปรเชลล์พร้อมใช้งานสำหรับกระบวนการเชลล์เท่านั้น ตัวแปรสภาพแวดล้อมพร้อมใช้งานสำหรับกระบวนการที่ตามมาไม่ใช่แค่เชลล์


2

นอกจากนี้หากคุณต้องการให้ตัวแปรพร้อมใช้งานสำหรับการเรียกเชลล์โดยไม่ต้องใช้การส่งออกคุณสามารถทำได้:

ไฟล์ a.ksh คือ -

#!/bin/ksh
FOO=bar

บนพรอมต์ให้เรียกใช้สิ่งนี้

> . a.ksh

สิ่งนี้จะเรียกใช้คำสั่งภายในเชลล์เดียวกันและ $ FOO จะพร้อมใช้งาน

ในขณะที่

> a.ksh

จะทำให้ $ FOO ใช้ได้เฉพาะภายใน a.ksh หลังจากการเรียกไปยัง a.ksh จะไม่มีอยู่จริง


1
แก้ไข. โปรดทราบว่า "." เป็นเพียงทางลัดสำหรับ "ซอร์ส" ซึ่งบางครั้งใช้ในสคริปต์เพื่อให้อ่านง่ายขึ้น ดู "ความช่วยเหลือ" หรือ "แหล่งความช่วยเหลือ" เพื่อดูรายละเอียด
sleske

1

นอกเหนือจากคำตอบที่ได้รับแล้วคำสั่งทั้งสองนี้ไม่จำเป็นต้องนิยาม (เช่นสร้าง vs set) ตัวแปรสภาพแวดล้อมเนื่องจาก "a" อาจมีอยู่แล้วในฐานะเชลล์หรือตัวแปรสภาพแวดล้อม

ในกรณีหลังทั้งสองงบจะเทียบเท่าอย่างเคร่งครัด

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