คุณจะทราบได้อย่างไรว่าตัวแปรเชลล์ส่งออกหรือไม่


13

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


4
เชลล์เป้าหมายหรือเชลล์เป้าหมายอีกครั้งหรือไม่ คุณสามารถชี้ไปที่การอ้างอิงสำหรับตัวแปรตัวพิมพ์ใหญ่ได้หรือไม่?
Jeff Schaller

ในเชลล์เป้าหมายอีกครั้งเนื่องจากตัวแปรทั้งหมดเป็นตัวพิมพ์ใหญ่คุณจะทราบได้อย่างไรว่าตัวแปรทุบตีใดที่อยู่ในเครื่อง
Shoulderpadz

7
@Shoulderpadz ไม่มีอะไรขัดขวางคุณจากการสร้างตัวแปรตัวพิมพ์เล็ก
muru

1
โดยท้องถิ่นคุณหมายถึงตัวแปรที่ไม่ได้ถูกส่งออก?
Eliah Kagan

4
ความแตกต่างที่คุณถามคือตัวแปรเชลล์กับตัวแปรสภาพแวดล้อมไม่ใช่แบบโกลบอลกับแบบโลคัล โปรดทราบว่ามีตัวแปรเชลล์ที่ไม่ใช่ตัวแปรสภาพแวดล้อม (เช่นสิ่งที่คุณกำลังเรียกว่า "ท้องถิ่น") และมีตัวแปรสภาพแวดล้อมที่ไม่ใช่ตัวแปรเชลล์ (สภาพแวดล้อมสามารถมีชื่อที่ไม่ใช่ตัวระบุเชลล์ที่ถูกต้องและด้วยเหตุนี้ ไม่สามารถเป็นตัวแปรได้)
chepner

คำตอบ:


17

หากคุณต้องการดูว่าตัวแปรถูกส่งออกหรือไม่ให้ใช้declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

export -pวิธีแบบพกพามากที่สุดคือ

export -pรายการตัวแปรส่งออก นี่คือมักจะชอบdeclare -x, ถ้าdeclareเปลือกของคุณมี

เปลือกหอยบอร์นสไตล์ที่ใช้ในปัจจุบันควรจะสนับสนุนexport -pขณะที่มันถูกต้องตาม POSIX :

เมื่อระบุ-p การส่งออกจะเขียนชื่อและค่าของตัวแปรที่เอ็กซ์พอร์ตทั้งหมดไปยังเอาต์พุตมาตรฐานในรูปแบบต่อไปนี้:

"export %s=%s\n", <name>, <value>

หากชื่อถูกตั้งค่าและ:

"export %s\n", <name>

ถ้าไม่มีการตั้งชื่อ

มาตรฐานอธิบายต่อไปว่าค่าของตัวแปรจะแสดงในลักษณะที่มักจะอนุญาตให้ใช้ในภายหลังทางด้านขวามือของ=ในการกำหนด นี่คือการพูดว่ามันอาจจะยกมา กระสุนที่แตกต่างกันอาจแสดงพวกมันแตกต่างกัน แต่มีผลเหมือนกัน export -pทำงานได้แม้อยู่ในเปลือกหอยที่ไม่มีdeclareในตัวเช่นDash

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

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

เชลล์บางตัวเช่น Bash ใช้รูปแบบที่ไม่ได้มาตรฐานเว้นแต่จะได้รับคำแนะนำอย่างชัดเจนให้ทำงานในลักษณะที่สอดคล้องกับ POSIX ใน Bash export -pจะให้ผลลัพธ์เช่นเดียวกับdeclare -xค่าเริ่มต้น

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh แสดงรูปแบบที่ไม่เป็นมาตรฐานแม้เมื่อเปิดใช้งานความเข้ากันได้ POSIX:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

ในกรณีใด ๆ คุณสามารถแยกการแสดงแบบพกพา (ซึ่งอาจจะยกมา) =โดยการค้นหาคำที่ตามมาด้วย สิ่งนี้ไม่ได้ขึ้นอยู่กับคำก่อนหน้าบนบรรทัดตราบใดที่คำเหล่านั้นไม่นำหน้าทันที=ซึ่งไม่ควรนำมาใช้ ตัวอย่างเช่น:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

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

เวลาส่วนใหญ่ของคุณเพียงแค่ต้องการที่จะตรวจสอบการส่งออกและดังนั้นคุณจะไม่สนใจว่ารายการจะนำหน้าด้วยexport, declare -x, typeset -xหรือสิ่งอื่น export -pจากนั้นเรียกเพียง

ฉันทดสอบคำสั่งเหล่านั้นบน Ubuntu 16.04 LTS ด้วยแต่ละเวอร์ชันที่บรรจุอย่างเป็นทางการของแต่ละเชลล์


0

ตัวแปรที่ไม่ถูกเอ็กซ์พอร์ตสามารถเห็นได้จากเอาต์พุตของdeclareคำสั่งใน bash

ตัวแปรที่มีการส่งออกสามารถเห็นได้จากการส่งออกของdeclare -xหรือexportคำสั่งในการทุบตี

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