Score:2

ความแตกต่างระหว่าง "echo" และ "export" ตัวแปรสภาพแวดล้อม?

ธง sa

สภาพแวดล้อมคือ Ubuntu 18

ถ้าฉันเพิ่มหนึ่งบรรทัด JAVA_HOME="/usr/java11" ใน /etc/environment และดำเนินการ ที่มา /etc/environment ฉันสามารถสะท้อนตัวแปรสภาพแวดล้อมนี้:

สะท้อน $JAVA_HOME
/usr/java11

แต่ถ้าฉันพยายามรับจากการส่งออก ตัวแปรนี้ไม่อยู่ในรายการ:

ส่งออก | grep JAVA_HOME
--ผลลัพธ์ว่างเปล่า--

จากนั้นฉันก็ใช้ ส่งออก $JAVA_HOME=/usr/java8 เพื่อส่งออกตัวแปร (สังเกตว่านี่คือ java8 ไม่ใช่ java 11) ฉันสามารถมี:

ส่งออก |grep JAVA_HOME
ประกาศ -x JAVA_HOME="/usr/java8"

ตอนนี้ฉันยังสามารถ สะท้อน $JAVA_HOME เป็น /usr/java11:

สะท้อน $JAVA_HOME
/usr/java11

คำถาม: อะไรคือความแตกต่างของ echo $ตัวแปร และ ส่งออก | grep JAVA_HOME?

ฉันลองใช้โปรแกรมหลามอย่างง่าย os.environ.get("JAVA_HOME") ส่งคืน "/usr/java8" จากการเอ็กซ์พอร์ต ไม่ใช่ echo

guiverc avatar
cn flag
คุณพูดถึง Ubuntu 18 นี่เป็นสภาพแวดล้อม * ที่มี * Ubuntu Core 18 หรือ * snap * เท่านั้นหรือไม่ เนื่องจากโมเดล *การคุมขัง* ที่เล่นใน 18 รีลีสแตกต่างจากโมเดล 18.04 ที่เปิดมากกว่า - โปรดระบุให้เจาะจง
hr flag
ฉันคิดว่าปัญหาที่นี่คือ `/etc/environment` เป็นเพียงรายการของคู่ชื่อ=ค่า เมื่ออ่านโดย `pam_env` ตัวแปรเหล่านั้นจะถูกส่งออกไปยังสภาพแวดล้อม แต่การจัดหาไว้ในเชลล์ปัจจุบันของคุณจะสร้างเฉพาะตัวแปรเชลล์ธรรมดา - ตรวจสอบด้วย `declare -p JAVA_HOME` เป็นต้น
Ben L avatar
sa flag
@steeldriver "ตัวแปรเชลล์ธรรมดา" คืออะไร และตัวแปรอื่นๆ คืออะไร
Ben L avatar
sa flag
@guiverc ขออภัยฉันไม่รู้ว่าอะไรคือ 'มี' และ 'สแนป' คืออะไร เป็นคอนเทนเนอร์นักเทียบท่าที่สร้างจาก 'FROM ubuntu:18.04'
guiverc avatar
cn flag
Ubuntu 18.04 เป็นผลิตภัณฑ์ที่แตกต่างจาก 18 ผลิตภัณฑ์; Ubuntu รุ่นปกติที่ใช้ *deb* (โดยไม่มีการบรรจุ) ใช้รูปแบบ *year.month*; แตกต่างจากผลิตภัณฑ์ 18 หรือ *ปี* ที่ใช้การกักกันUbuntu มีผลิตภัณฑ์ที่ใช้ *ปี* ตั้งแต่ปี 2559 - คุณควรแม่นยำเนื่องจาก 18 และ 18.04 เป็นตัวแทนของผลิตภัณฑ์ที่แตกต่างกัน (รุ่น 18 ไม่สามารถใช้แพ็คเกจ *deb* ได้ - เป็น *snap* เท่านั้น) fyi: *confinement* รุ่นต่างๆ สามารถแตกต่างกันไปตาม snap ; แต่ถ้าคุณคุ้นเคยกับคอนเทนเนอร์ คุณรู้สิ่งนี้ มันเหมือนกันกับคำศัพท์ที่แตกต่างกัน ..
vanadium avatar
cn flag
สิ่งนี้ตอบคำถามของคุณหรือไม่ [set, export และ env ต่างกันอย่างไร และควรใช้เมื่อใด](https://askubuntu.com/questions/205688/whats-the-difference-between-set-export-and-env-and-when -ฉัน-ควรใช้-ละ)
Score:12
ธง hr

ปัญหาที่นี่ไม่ใช่ความแตกต่างระหว่าง เสียงสะท้อน และ ส่งออกแต่ความแตกต่างระหว่าง ตัวแปรสภาพแวดล้อม และแบบง่ายๆ ตัวแปรเชลล์ (และยังเกี่ยวกับวิธีการ /อื่นๆ/สิ่งแวดล้อม ไฟล์ใช้งานได้ตามปกติ)

โดยเฉพาะอย่างยิ่งแม้ว่า /อื่นๆ/สิ่งแวดล้อม มีบรรทัดของแบบฟอร์ม ชื่อ = มูลค่า ที่ถูกต้องเป็นการกำหนดตัวแปรเชลล์ POSIX จุดประสงค์หลัก (ในระบบ Linux สมัยใหม่) จะถูกอ่านโดย pam_env โมดูลในระหว่างการเริ่มต้นเซสชันของผู้ใช้ - มันคือ pam_env ที่ส่งออกไปยังสภาพแวดล้อมของผู้ใช้

เมื่อคุณมา /อื่นๆ/สิ่งแวดล้อม ในเชลล์ของคุณ ไม่มีเวทย์มนตร์พิเศษที่บอกเชลล์ว่าการมอบหมายเป็นตัวแปรสภาพแวดล้อม (ซึ่งส่งออกไปยังสภาพแวดล้อม และด้วยเหตุนี้จึงสืบทอดโดยกระบวนการย่อย) แทนที่จะเป็นตัวแปรเชลล์ปกติ (ซึ่งเพิ่งมีอยู่ในเชลล์ปัจจุบัน ขอบเขต).

ครั้งต่อไปที่คุณเข้าสู่ระบบ pam_env จะทำเวทมนตร์และ JAVA_HOME จะ แล้วปรากฏในผลลัพธ์ของ ส่งออก | grep JAVA_HOME.

ดูสิ่งนี้ด้วย

Ben L avatar
sa flag
ขอบคุณที่ชี้ให้เห็นความแตกต่างระหว่าง "ตัวแปรเชลล์" และ "ตัวแปรสภาพแวดล้อม"
vanadium avatar
cn flag
"ตัวแปรด้านสิ่งแวดล้อม" ในทางเทคนิคแล้วก็คือ "ตัวแปรเชลล์" พวกมันเป็นส่วนย่อย
Score:5
ธง cn

เสียงสะท้อน และ ส่งออก เป็นคำสั่งที่แตกต่างกันมากในตอนแรก

  • เสียงสะท้อน จะแสดงข้อความ ใน สะท้อน $JAVA_HOMEเชลล์จะแทนที่ $JAVA_HOME ด้วยเนื้อหาของตัวแปรเชลล์ JAVA_HOME ที่ถูกกำหนด มิฉะนั้น, $JAVA_HOME จะส่งคืนสตริงว่าง
  • ส่งออก จัดเตรียมแอตทริบิวต์ "ส่งออก" ให้กับตัวแปรเชลล์ ส่งออก JAVA_HOME จะตั้งค่าแอตทริบิวต์การส่งออก กล่าวคือ ตัวแปรจะพร้อมใช้งานในสภาพแวดล้อมของเชลล์ย่อยหรือกระบวนการย่อยใดๆ แทนที่จะเป็นในเชลล์ปัจจุบันของคุณเท่านั้น หากยังไม่ได้ตั้งค่าตัวแปร คุณสามารถกำหนดในขณะที่ส่งออกเป็น in ส่งออก JAVA_HOME=/usr/java11.

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

`JAVA_HOME=/usr/java11`

จากนั้นสิ่งที่จะทำคือกำหนดตัวแปรเชลล์ PATH เป็นค่าปัจจุบัน

อย่างไรก็ตาม เนื่องจากคุณรวมตัวแปรไว้ใน /อื่นๆ/สิ่งแวดล้อมควรส่งออกอย่างมีประสิทธิภาพในระหว่างการเริ่มต้นระบบครั้งต่อไปของคุณ จากนั้นควรมีอยู่ใน ส่งออก และแสดงตัวใน สะท้อน $JAVA_HOME ในเทอร์มินัลแรกที่คุณเปิด สิ่งที่คุณสังเกตเห็นในขณะนี้คือเนื่องจากคุณยังไม่ได้รีสตาร์ทเครื่องหลังจากแก้ไข /อื่นๆ/สิ่งแวดล้อม (และไม่ได้ส่งออกตัวแปรด้วยวิธีอื่น)

Score:3
ธง in

สร้างจากคำตอบอื่น ๆ ที่นี่ บางคำสั่งที่ขนานกัน ส่งออก แต่สำหรับตัวแปรหมวดอื่นๆนั้น ชุด (ซึ่งใช้งานได้เช่น ตัวแปร = ค่า แล้ว ชุด | grep ตัวแปร) และ สิ่งแวดล้อม

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

ดู set, export และ env ต่างกันอย่างไร และฉันควรใช้แต่ละอย่างเมื่อใด

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

Score:0
ธง us

เสียงสะท้อน เป็นคำสั่งสำหรับพิมพ์ข้อความและตัวแปรไปยัง stdout (หรือ redirect)

ส่งออก แสดงรายการตัวแปรที่เอ็กซ์พอร์ตปัจจุบันในเชลล์

หัวข้อนี้อธิบายว่าทำไมคุณถึงใช้ ส่งออก ดีกว่าที่ฉันทำได้:

https://stackoverflow.com/questions/7411455/what-does-export-do-in-shell-programming ... มันอธิบายได้ดีว่าการส่งออกคืออะไรสำหรับ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา