คำสั่ง 'ส่งออก' ทำอะไร?


86

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

ผมเริ่มที่จะทำงานร่วมกับเจนกินส์เมื่อเร็ว ๆ นี้และจากนั้นผมต้องใช้นี้exportคำสั่งในการเรียกใช้สงครามเก็บเจนกินส์ ดังนั้นฉันจำเป็นต้องรู้ว่าexportคำสั่งทั่วไปทำอะไรและทำไมเราต้องรันคำสั่งนี้ในขณะที่เรียกใช้เจนกินส์ (หลังจากตั้งค่าบ้านของเจนกินส์แล้ว)

ขอบคุณ!


1
มันจะช่วยได้ถ้าคุณพูดเพิ่มเติมเกี่ยวกับคำสั่งส่งออกที่คุณใช้ หากไม่มีบริบทเพิ่มเติมฉันเดาว่าคุณกำลังตั้งค่าตัวแปรสภาพแวดล้อม ดูen.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd


เป็นไปได้ที่จะซ้ำกันของคำสั่ง unix export
John Kugelman

คำตอบ:


99

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

exportถูกกำหนดไว้ใน POSIX :

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


ขอบคุณมาก! คำตอบทั้งหมดของคุณมีประโยชน์มากและยังแนะนำให้เรียนรู้อีกสองสามสิ่งด้วย :-)
ชาธรากุลสิงห์

1
กระบวนการเด็กในแง่นี้คืออะไร?
AsyncMoksha

@MartinHansen ไม่เข้าใจอะไร ดูคำตอบของฉันด้วย
barlop

มีวงเล็บเหลี่ยมพิเศษที่ท้ายลิงก์ฉันไม่สามารถแก้ไขได้เนื่องจากเป็นการแก้ไขสัญลักษณ์
Radoslav Stoyanov

28

ฉันเดาว่าคุณมาจากพื้นหลังของหน้าต่าง ดังนั้นฉันจะตัดกันพวกเขา (ฉันยังใหม่กับ linux ด้วย) ฉันพบว่าการตอบกลับของผู้ใช้สำหรับความคิดเห็นของฉันเป็นประโยชน์ในการค้นหาสิ่งต่างๆ

ใน Windows ตัวแปรอาจเป็นแบบถาวรหรือไม่ก็ได้ คำว่าตัวแปรสภาพแวดล้อมรวมถึงชุดตัวแปรในเชลล์ cmd ด้วยคำสั่ง SET เช่นเดียวกับเมื่อตัวแปรถูกตั้งค่าภายใน Windows GUI จึงตั้งค่าในรีจิสทรีและสามารถดูได้ในหน้าต่าง cmd ใหม่ เช่นเอกสารประกอบคำสั่ง set ใน windows https://technet.microsoft.com/en-us/library/bb490998.aspx "แสดงตั้งค่าหรือลบตัวแปรสภาพแวดล้อมใช้โดยไม่มีพารามิเตอร์ set จะแสดงการตั้งค่าสภาพแวดล้อมปัจจุบัน" ใน Linux set ไม่แสดงตัวแปรสภาพแวดล้อมโดยจะแสดงตัวแปรเชลล์ซึ่งไม่เรียก / อ้างถึงว่าเป็นตัวแปรสภาพแวดล้อม นอกจากนี้ Linux ไม่ได้ใช้ set เพื่อตั้งค่าตัวแปร (นอกเหนือจากพารามิเตอร์ตำแหน่งและตัวเลือกเชลล์ซึ่งฉันอธิบายเป็นหมายเหตุในตอนท้าย) เพียงเพื่อแสดงตัวแปรเหล่านี้และแม้กระทั่งเพื่อแสดงตัวแปรเชลล์เท่านั้น Windows ใช้ set สำหรับการตั้งค่าและแสดงเช่น set a = 5, linux ไม่ได้

ใน Linux ฉันเดาว่าคุณสามารถสร้างสคริปต์ที่ตั้งค่าตัวแปรในการบูตได้เช่น/etc/profileหรือ/etc/.bashrcแต่อย่างอื่นมันจะไม่ถาวร เก็บไว้ในแรม

ลินุกซ์มีความแตกต่างระหว่างตัวแปรเชลล์และตัวแปรสภาพแวดล้อม ใน Linux ตัวแปรเชลล์จะอยู่ในเชลล์ปัจจุบันเท่านั้นและตัวแปรสภาพแวดล้อมจะอยู่ในเชลล์นั้นและเชลล์ลูกทั้งหมด

คุณสามารถดูตัวแปรเชลล์ด้วยsetคำสั่ง (โปรดทราบว่าไม่เหมือน windows ตัวแปรไม่ได้ถูกตั้งค่าใน linux ด้วยคำสั่ง set)

set -o posix; set (ทำ set -o posix ครั้งแรกช่วยไม่ให้แสดงสิ่งที่ไม่จำเป็นมากเกินไป) ดังนั้นsetแสดงตัวแปรเชลล์

คุณสามารถดูตัวแปรสภาพแวดล้อมด้วยenvคำสั่ง

ตัวแปรเชลล์ถูกตั้งค่าด้วยเช่น just a = 5

ตัวแปรสภาพแวดล้อมถูกตั้งค่าด้วยการส่งออกการส่งออกยังตั้งค่าตัวแปรเชลล์

ที่นี่คุณจะเห็นตัวแปรเชลล์ zzz ที่ตั้งค่าด้วย zzz = 5 และเห็นว่ามันแสดงเมื่อทำงานsetแต่ไม่แสดงเป็นตัวแปรสภาพแวดล้อม

ที่นี่เราเห็น yyy ตั้งค่าด้วยการส่งออกดังนั้นจึงเป็นตัวแปรสภาพแวดล้อม และดูว่ามันแสดงภายใต้ตัวแปรเชลล์และตัวแปรสภาพแวดล้อม

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

เธรดที่มีประโยชน์อื่น ๆ

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

หมายเหตุ - จุดหนึ่งที่อธิบายรายละเอียดเล็กน้อยและค่อนข้างถูกต้องกับสิ่งที่ฉันเขียนไว้คือใน linux bash สามารถใช้ "set" เพื่อตั้งค่า "positional parameters" และ "shell options / attributes" และในทางเทคนิคทั้งสองอย่าง สิ่งเหล่านี้เป็นตัวแปรแม้ว่า man page อาจไม่ได้อธิบายว่าเป็นเช่นนั้น แต่ตามที่กล่าวไว้ set จะไม่ตั้งค่าตัวแปรเชลล์หรือตัวแปรสภาพแวดล้อม) หากคุณทำเช่น set asdfนั้นจะตั้งค่า $ 1 เป็น asdf และหากecho $1คุณเห็น asdf ถ้าคุณทำset a=5จะไม่ตั้งค่าตัวแปร a เท่ากับ 5 มันจะตั้งค่าพารามิเตอร์ตำแหน่ง $ 1 เท่ากับสตริงของ "a = 5" ดังนั้นหากคุณเคยเห็น set a = 5 ใน linux อาจเป็นความผิดพลาดเว้นแต่จะมีใครต้องการสตริงนั้น a = 5 ใน $ 1 สิ่งอื่น ๆ ที่ชุดของ linux สามารถตั้งค่าได้คือ shell options / attributes ถ้าคุณตั้งค่า -o คุณจะเห็นรายการของพวกเขา และคุณสามารถทำได้ตัวอย่างเช่นset -o verboseปิดเพื่อเปิดใช้งาน verbose (btw ค่าเริ่มต้นเกิดขึ้นเพื่อปิด แต่ไม่ได้สร้างความแตกต่างกับสิ่งนี้) หรือset +o verboseจะปิด verbose ก็ได้ Windows ไม่มีการใช้งานดังกล่าวสำหรับคำสั่ง set


ดูเหมือนว่าชุดจะแสดงเชลล์และสภาพแวดล้อมและ 'env' จะแสดงเฉพาะสภาพแวดล้อมเท่านั้น
barlop

1
ชอบคำตอบนี้มากเนื่องจากครอบคลุมกรณี nix vs win ซึ่งอาจทำให้สับสนได้ในตอนแรก
N0thing

6

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


1
แต่ถ้าฉันพูดa=5แล้วecho $aมันจะขึ้นว่า 5. แต่คุณเขียนว่า "เมื่อใดก็ตามที่คุณเปลี่ยนค่าตัวแปรใด ๆ เชลล์จะไม่มีทางเลือกการเปลี่ยนแปลงนั้นได้นั่นหมายความว่าการเปลี่ยนแปลงที่คุณทำจะมีผลในเซสชันเชลล์ใหม่" . <- แล้วมันอัปเดตเซสชันเชลล์โดยไม่ต้องเอ็กซ์พอร์ตได้อย่างไร คุณช่วยยกตัวอย่างได้ไหมว่าจำเป็นต้องส่งออกหรือไม่?
barlop

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