โชคไม่ดีที่ไม่มีตำแหน่งแบบพกพาในการตั้งค่าตัวแปรสภาพแวดล้อม ไฟล์สองไฟล์ที่ใกล้เคียงที่สุดคือ~/.profile
ซึ่งเป็นตำแหน่งดั้งเดิมและทำงานนอกกรอบในการตั้งค่าจำนวนมากและ~/.pam_environment
เป็นทางเลือกที่ทันสมัยธรรมดา แต่มีข้อ จำกัด
สิ่งที่ควรใส่ ~/.pam_environment
ไฟล์~/.pam_environment
ถูกอ่านโดยวิธีการเข้าสู่ระบบทั้งหมดที่ใช้PAMและเปิดใช้งานไฟล์นี้ ซึ่งครอบคลุมระบบ Linux ส่วนใหญ่ในปัจจุบัน
ข้อได้เปรียบที่สำคัญของ~/.pam_environment
มันคือ (เมื่อเปิดใช้งาน) มันถูกอ่านก่อนที่เชลล์ของผู้ใช้จะเริ่มทำงานดังนั้นจึงทำงานได้โดยไม่คำนึงถึงประเภทเซสชัน, ล็อกอินเชลล์และความซับซ้อนอื่น ๆ มันยังทำงานสำหรับการเข้าสู่ระบบไม่โต้ตอบเช่นและsu -c somecommand
ssh somecommand
ข้อ จำกัด ที่สำคัญ~/.pam_environment
คือคุณสามารถกำหนดได้ง่าย ๆ เท่านั้นไม่ใช่ไวยากรณ์เชลล์ที่ซับซ้อน ไวยากรณ์ของไฟล์นี้เป็นดังนี้
- ไฟล์จะถูกวิเคราะห์คำทีละบรรทัด
- ช่องว่างนำหน้าจะถูกละเว้น
- คุณสามารถเลือกที่จะเริ่มต้นบรรทัดด้วย
export
และเว้นวรรคเดียว (ไม่ใช่แท็บ, ไปคิดเลข)
- หลังจากนั้นแต่ละบรรทัดจะต้องมีรูปแบบ
VAR=VALUE
ที่ VAR ประกอบด้วยตัวอักษรตัวเลขและขีดล่าง
#
เริ่มความคิดเห็นมันไม่สามารถปรากฏในค่า
- หาก VALUE เริ่มต้นด้วย
'
หรือ"
และมีเครื่องหมายคำพูดเหมือนกันอีกข้อความหนึ่ง VAR จะถูกตั้งค่าเป็นสตริงระหว่างเครื่องหมายคำพูด (ทุกอย่างหลังจากเครื่องหมายคำพูดที่สองถูกละเว้น) มิฉะนั้น VAR จะถูกตั้งค่าเป็นสตริงหลัง=
เครื่องหมาย
- หากไม่มี
=
อยู่ตัวแปรจะถูกลบออกจากสภาพแวดล้อม
กลับหัวกลับหาง~/.pam_environment
ทำงานในสถานการณ์มากมาย ในข้อเสียคุณไม่สามารถมีการตั้งค่าแบบไดนามิกใด ๆ เช่นฐานค่าของตัวแปรกับตัวแปรอื่น (เช่นการเพิ่มไดเรกทอรีไปยัง PATH) หรือใช้ผลลัพธ์ของคำสั่ง (เช่นทดสอบว่ามีไดเรกทอรีหรือโปรแกรม) และบางส่วน อักขระ ( #'"
ขึ้นบรรทัดใหม่) เป็นไปไม่ได้หรือมีปัญหาในการใส่ค่า
สิ่งที่ควรใส่ ~/.profile
ไฟล์นี้ควรมีไวยากรณ์ sh (พกพา) แบบพกพา เพียงใช้ ksh หรือทุบตีส่วนขยาย (อาร์เรย์[[ … ]]
ฯลฯ ) /bin/sh
ถ้าคุณรู้ว่าระบบของคุณมีเปลือกหอยเหล่านี้เป็น
แฟ้มนี้อาจจะอ่านโดยสคริปต์ในการใช้งานอัตโนมัติจึงไม่ควรเรียกโปรแกรมที่ผลิตออกใด ๆ exec
หรือโทร หากคุณต้องการทำเช่นนั้นในการเข้าสู่ระบบโหมดข้อความให้ทำสำหรับเชลล์แบบโต้ตอบเท่านั้น ตัวอย่าง:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
นี่เป็นตัวอย่างของการใช้/bin/sh
เป็นเชลล์ล็อกอินของคุณและเปลี่ยนเป็นเชลล์ที่คุณชื่นชอบ ดูเพิ่มเติมว่าฉันจะใช้ทุบตีเป็นเปลือกเข้าสู่ระบบของฉันอย่างไรเมื่อระบบดูแลระบบของฉันปฏิเสธที่จะให้ฉันเปลี่ยน
เมื่อ~/.profile
ไม่อ่านในการเข้าสู่ระบบที่ไม่ใช่กราฟิก?
ที่แตกต่างกันหอยเข้าสู่ระบบอ่านไฟล์ที่แตกต่างกัน
หากเปลือกเข้าสู่ระบบของคุณเป็นทุบตี
ทุบตีอ่าน~/.bash_login
หรือถ้าพวกเขามีอยู่แทน~/.bash_profile
~/.profile
นอกจากนี้ bash จะไม่อ่าน~/.bashrc
ในเชลล์ล็อกอินแม้ว่ามันจะเป็นแบบโต้ตอบ หากไม่ต้องการจดจำข้อผิดพลาดเหล่านี้อีกให้สร้าง a ~/.bash_profile
ด้วยสองบรรทัดต่อไปนี้:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
ดูเพิ่มเติมไฟล์ตั้งค่าใดที่ควรใช้สำหรับตั้งค่าตัวแปรสภาพแวดล้อมด้วย bash
หากเชลล์ล็อกอินของคุณคือ zsh
zsh อ่าน~/.zprofile
และแต่ไม่~/.zlogin
~/.profile
Zsh มีรูปแบบที่แตกต่างจาก sh แต่สามารถอ่านได้~/.profile
ในโหมดem sh คุณสามารถใช้สิ่งนี้เพื่อ~/.zprofile
:
emulate sh -c '. ~/.profile'
ดูZsh ด้วยไม่กดปุ่ม ~ / .profile
หากเปลือกเข้าสู่ระบบของคุณเป็นเปลือกอื่น ๆ
มีไม่มากที่คุณสามารถทำได้มีเพียงการใช้/bin/sh
เชลล์การเข้าสู่ระบบและเชลล์ที่คุณโปรดปราน (เช่นปลา) เป็นเชลล์เชิงโต้ตอบเท่านั้น นั่นคือสิ่งที่ฉันทำกับ zsh ดูตัวอย่างการเรียกเชลล์อื่นจากด้าน~/.profile
บน
คำสั่งระยะไกล
เมื่อเรียกใช้คำสั่งระยะไกลโดยไม่ต้องผ่านเชลล์แบบโต้ตอบเชลล์บางตัวเท่านั้นที่อ่านไฟล์เริ่มต้น
Ksh อ่านไฟล์ที่ระบุโดยENV
ตัวแปรหากคุณจัดการเพื่อส่งผ่าน
ทุบตีอ่าน~/.bashrc
ถ้ามันเป็นไม่ได้โต้ตอบ (!) และการปกครองของมันจะถูกเรียกว่าหรือrshd
sshd
ดังนั้นคุณสามารถเริ่มต้น~/.bashrc
ด้วย
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh มักจะอ่าน~/.zshenv
เมื่อมันเริ่ม ใช้ด้วยความระมัดระวังเนื่องจากสิ่งนี้จะถูกอ่านโดยทุก ๆ อินสแตนซ์ของ zsh แม้ว่ามันจะเป็น subshell ที่คุณตั้งค่าตัวแปรอื่น ๆ หาก zsh เป็นเปลือกเข้าสู่ระบบของคุณและคุณต้องการที่จะใช้กับตัวแปรชุดเท่านั้นสำหรับคำสั่งระยะไกลใช้ยาม: ตั้งค่าตัวแปรบางอย่างใน~/.profile
เช่นMY_ENVIRONMENT_HAS_BEEN_SET=yes
, ~/.profile
และตรวจสอบยามนี้ก่อนที่จะอ่าน
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
กรณีของการเข้าสู่ระบบแบบกราฟิก
ดิสทริบิวเตอร์และสภาพแวดล้อมเดสก์ท็อปจำนวนมากจัดเตรียมให้ทำงาน~/.profile
โดยการจัดหาอย่างชัดเจนจากสคริปต์เริ่มต้นหรือโดยใช้เชลล์ล็อกอิน
น่าเสียดายที่ไม่มีวิธีทั่วไปในการจัดการชุด distro / DM / DE ที่~/.profile
ไม่ได้อ่าน
หากคุณใช้เซสชันดั้งเดิมที่เริ่มโดยที่~/.xsession
นี่เป็นสถานที่ที่คุณควรตั้งค่าตัวแปรสภาพแวดล้อมของคุณ ทำได้โดยการจัดหา~/.profile
(เช่น. ~/.profile
) โปรดทราบว่าในการตั้งค่าบางอย่างสคริปต์เริ่มต้นสภาพแวดล้อมเดสก์ท็อปจะมา~/.profile
อีกครั้ง