ใช้การส่งออกใน. bashrc


45

ฉันสังเกตเห็น.bashrcว่ามีบางบรรทัดexportอยู่ข้างหน้าพวกเขาเช่น

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

ในขณะที่คนอื่นไม่เช่น

HISTSIZE=100000

ผมสงสัยว่าถ้าครั้งแรกนี้ถูกต้องและสองสิ่งที่เป็นกฎสำหรับการใช้ในexport.bashrc

คำตอบ:


53

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

นี่คือสิ่งที่หน้าคนพูดว่า:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

สิ่งนี้สามารถสาธิตได้ดังต่อไปนี้:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

คำอธิบาย:

  • ครั้งแรกที่ผมตั้งให้เป็นตัวแปรเปลือกหอย${MYVAR} MYVAR="value"ใช้echoฉันสามารถสะท้อนมูลค่าของมันเพราะ echo เป็นส่วนหนึ่งของเปลือก
  • echo.shแล้วฉันจะสร้าง นั่นเป็นสคริปต์ตัวเล็ก ๆ ที่ทำแบบเดียวกันโดยทั่วไปมันแค่ก้อง${MYVAR}แต่ความแตกต่างก็คือมันจะทำงานในกระบวนการที่แตกต่างกันเพราะมันเป็นสคริปต์ที่แยกต่างหาก
  • เมื่อเรียกecho.shมันจะไม่ส่งผลอะไรเนื่องจากกระบวนการใหม่ไม่ได้รับมรดก${MYVAR}
  • จากนั้นฉันก็ส่งออก${MYVAR}ไปยังสภาพแวดล้อมด้วยexportคำหลัก
  • เมื่อตอนนี้ฉันทำงานเหมือนเดิมecho.shอีกครั้งมันก็สะท้อนเนื้อหาของ${MYVAR}เพราะมันได้รับมาจากสภาพแวดล้อม

ดังนั้นเพื่อตอบคำถามของคุณ:

ขึ้นอยู่กับตัวแปรที่จะใช้ไม่ว่าคุณจะต้องส่งออกหรือไม่


17

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

  • HOME- ระบุไดเรกทอรีบ้านของผู้ใช้ซึ่งเป็นที่ตั้งของไฟล์กำหนดค่าต่อผู้ใช้ ใช้โดยโปรแกรมใด ๆ ที่อ่านไฟล์กำหนดค่าต่อผู้ใช้หรือจำเป็นต้องทราบตำแหน่งของโฮมไดเร็กตอรี่ของผู้ใช้
  • PATH- ระบุตำแหน่งที่จะค้นหาไฟล์เรียกทำงานเพื่อเปิดโปรแกรมอื่น ๆ ใช้โดยทุกโปรแกรมที่ต้องเริ่มโปรแกรมอื่น
  • LD_LIBRARY_PATH- ระบุตำแหน่งที่จะค้นหาไฟล์ไลบรารีแบบไดนามิก ใช้โดยทุกปฏิบัติการเชื่อมโยงแบบไดนามิก
  • EDITOR, VISUAL- ระบุว่าโปรแกรมจะทำงานเมื่อจำเป็นต้องมีโปรแกรมแก้ไข ใช้โดยโปรแกรมใด ๆ ที่จำเป็นต้องเปิดตัวแก้ไขข้อความ
  • DISPLAY, XAUTHORITY- ระบุวิธีเชื่อมต่อกับเซิร์ฟเวอร์ X11 ใช้โดยไคลเอนต์ X11 (เช่นโปรแกรม GUI)
  • LESS- ตัวเลือกเปิดโดยอัตโนมัติเมื่อlessทำงาน lessใช้โดย
  • http_proxy- ระบุเว็บพรอกซีที่จะใช้ ใช้โดยเว็บเบราว์เซอร์ส่วนใหญ่

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

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

นอกจากตัวแปรที่ใช้โดยเชลล์แล้วเชลล์สคริปต์ส่วนใหญ่ใช้ตัวแปรเพื่อจุดประสงค์ภายใน

ตัวแปรสภาพแวดล้อมส่วนใหญ่ (เช่นPATH) เหมาะสมสำหรับเซสชันทั้งหมดและควรตั้งค่า~/.profileหรือไฟล์ที่คล้ายกัน ตัวแปรที่ทำให้รู้สึกเพียงเปลือกที่เฉพาะเจาะจง (เช่นPS1) ควรจะตั้งอยู่ในไฟล์เปลือกที่เฉพาะเจาะจงเช่นหรือ~/.bashrc ~/.zshrcดูมีไฟล์เทียบเท่า ".bashrc" ที่เชลล์อ่านทั้งหมดหรือไม่


3

exportสำหรับตัวแปรภายในทุบตีคุณไม่จำเป็นต้อง จากตัวอย่างของคุณ HISTTIMEFORMATจะถูกใช้โดยทุบตีตัวเองและไม่จำเป็นต้องส่งออก MYSQL_HISTFILEเป็นmysqlและความต้องการที่ส่งออกเป็นอย่างอื่นmysqlไม่ได้เห็นมัน

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