ฉันจะตั้งค่าตัวแปรสภาพแวดล้อมของผู้ใช้ได้อย่างไร (ถาวรไม่ใช่เซสชัน)


145

นี่มันน่ารำคาญ ฉันเห็นคำแนะนำหลายประการ (ทั้งหมดใช้ไฟล์และไวยากรณ์ที่แตกต่างกัน) และไม่ทำงานเลย

ฉันจะตั้งค่าตัวแปรสภาพแวดล้อมสำหรับผู้ใช้ที่เฉพาะเจาะจงได้อย่างไร ฉันกำลังบีบเดเบียน ไวยากรณ์ที่แน่นอนที่ฉันควรใส่ในไฟล์เพื่อทำ ABC = "123" คืออะไร?


7
คุณลองทำอะไรไปแล้ว?
l0b0

1
การแก้ไข. bashrc, .bash_profile, .profile และ. ssh / eviroment แม้ว่าฉันไม่รู้ว่าฉันเขียนไว้ในตำแหน่งที่ถูกต้องหรือมีไวยากรณ์ที่ถูกต้องในแต่ละครั้ง

4
.bashrcเป็นสถานที่หลักสำหรับการที่
rozcietrzewiacz

@rozcietrzewiacz: ok แต่ ... หลังจากมีวิธีแก้ปัญหาฉันพยายามตั้งค่า ABC1 และ ABC2 ที่จุดเริ่มต้นและจุดสิ้นสุดของไฟล์นั้นและมันไม่ได้ตั้งในสภาพแวดล้อมของฉัน

1
ตรวจสอบว่ามีบางสิ่งบางอย่างเช่น.bash_profile [[ -f ~/.bashrc ]] && . ~/.bashrc
rozcietrzewiacz

คำตอบ:


113

คุณต้องวางการประกาศในไฟล์เริ่มต้นของเชลล์ของคุณ:

  • หากคุณกำลังใช้ bash, ash, ksh หรือเปลือกสไตล์บอร์นอื่น ๆ คุณสามารถเพิ่ม

    ABC="123"; export ABC
    

    ใน.profileไฟล์ของคุณ( ${HOME}/.profile) นี่คือสถานการณ์เริ่มต้นในการติดตั้ง Unix ส่วนใหญ่และโดยเฉพาะอย่างยิ่งใน Debian

    หากเชลล์ล็อกอินของคุณเป็นทุบตีคุณสามารถใช้.bash_profile( ${HOME}/.bash_profile) หรือ.bash_loginแทน

    หมายเหตุ:หากมีไฟล์ใดไฟล์หนึ่งเหล่านี้อยู่และเชลล์ล็อกอินของคุณเป็น bash .profileจะไม่อ่านเมื่อคุณล็อกอินผ่าน ssh หรือบนคอนโซลข้อความ แต่อาจยังอ่านได้แทนที่จะ.bash_profileเข้าสู่ระบบจาก GUI นอกจากนี้ถ้าไม่มีแล้วใช้.bash_profile.bashrc

  • หากคุณได้ตั้ง zsh เป็นเปลือกเข้าสู่ระบบของคุณให้ใช้แทน~/.zprofile~/.profile

  • หากคุณใช้ tcsh ให้เพิ่ม

    setenv ABC "123"
    

    ใน.loginไฟล์ ( ${HOME}/.login)

  • หากคุณใช้เชลล์อื่นดูคู่มือเชลล์วิธีกำหนดตัวแปรสภาพแวดล้อมและไฟล์ใดที่ถูกเรียกใช้เมื่อเริ่มต้นเชลล์


5
พฤติกรรมเริ่มต้นของsu userคือการเปลี่ยนความเป็นเจ้าของของเปลือกปัจจุบันเป็นชื่อผู้ใช้หาเรื่องในขณะที่การรักษาไดเรกทอรีบ้านและสภาพแวดล้อมของผู้ใช้ที่โทร ในการเข้าสู่เชลล์ในลักษณะที่จะเป็นผู้ใช้ใหม่และได้รับการตั้งค่าสภาพแวดล้อมทั้งหมด ($ PATH, $ HOME, $ ABC, ฯลฯ ) คุณต้องผ่าน a - เป็นอาร์กิวเมนต์แรกของ su su - usernameจะทำสิ่งที่คุณต้องการให้สำเร็จ
Tim Kennedy

1
รอ: คุณหมายถึงอะไร "exited to root"? ไม่ว่าในกรณีใดการสร้าง 'su' ไม่ได้เริ่มต้นเชลล์ คุณต้อง 'su -' (ดูman su)
Matteo

1
ทำไมคุณsuถึงมาเป็นอันดับแรก คุณไม่ได้สร้างเจ้าของรูท.profileที่ผู้ใช้ไม่สามารถใช้ได้ใช่ไหม
rozcietrzewiacz

1
@id นี่คือสิ่งที่ควรทำ คำถามคือสิ่งที่มาเมื่อคุณเข้าสู่ระบบเพื่อตรวจสอบว่าออกจากระบบก่อน
rozcietrzewiacz

7
เนื่องจาก.profileเชลล์ทั้งหมดที่เข้ากันได้กับบอร์นอ่านแล้วคุณไม่ควรเขียนไวยากรณ์ Bash ในไฟล์นั้น โดยเฉพาะอย่างยิ่งexport VARIABLE=valueต้องมีการปรับสภาพVARIABLE=value; export VARIABLEใหม่
tripleee

48

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

ABC="123"

ตอนนี้ตัวแปรABCจะสามารถเข้าถึงได้จากเซสชันผู้ใช้ทั้งหมด หากต้องการทดสอบเอาต์พุตตัวแปรก่อนรีเฟรชตัวแปรสภาวะแวดล้อมโดยใช้คำสั่ง

source /etc/environment

echo $ABCและเรียกใช้


4
+1 สำหรับคำสั่งต้นทาง นั่นคือคำตอบทั้งหมดที่หายไป
Nerrve

5
ระวังที่/etc/environmentไม่รองรับไวยากรณ์ bash เต็มสิ่งที่ฉันคิดออกอย่างหนัก ตัวอย่างเช่นการวางPATH="/usr/bin:/usr/sbin"แล้วทำPATH="$PATH:/foo/bar"ในบรรทัดต่อไปนี้จะไม่ทำงาน
user2428118

ไม่แน่ใจว่านี้เป็นปัญหาส่วนบุคคลหรือสิ่งที่ แต่ผมต้องรีบูต OS ของฉันหลังจากการตั้งค่าในเรื่องนี้แม้ว่าฉันเริ่มต้นใหม่ขั้วทุบตีหรือพิมพ์/etc/environment source /etc/environmentดังนั้นหากคุณมีปัญหาเกี่ยวกับตัวแปรสภาพแวดล้อมที่ไม่เป็นอมตะลองรีบูตเครื่อง
Blairg23

9

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

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

จากนั้นคุณต้องหาว่าจุดไหนที่เชลล์นี้จะอ่านได้ตามปกติ:

man $shell

ทางลัดที่อาจใช้งานได้คือการแสดงรายการไฟล์ดอทเหล่านั้นซึ่งมีชื่อเชลล์:

ls ~/.*${shell}*

หากคุณต้องการตรวจสอบว่าไฟล์ใดไฟล์หนึ่งถูกอ่านจริงระหว่างการล็อกอินคุณสามารถพิมพ์ชื่อไฟล์ในแต่ละไฟล์ตัวอย่างเช่น:

echo .bashrc

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

เมื่อมันมาถึงการประกาศตัวแปร "ถาวร" โปรดทราบว่าสิ่งนี้ขยายไปถึงเซสชั่นเท่านั้น ไม่มีวิธีในการเข้าถึงค่าของตัวแปรโดยไม่มีเซสชันดังนั้นจึงไม่มีความหมายนอกหนึ่ง หากคุณหมายถึง "อ่านอย่างเดียว" นั่นคือการพึ่งพาเชลล์และในBashคุณสามารถใช้:

declare -r VAR

หากมีค่าอยู่แล้วหรือ

declare -r VAR=value

เพื่อกำหนดในเวลาเดียวกัน เชลล์บางตัวเท่านั้นที่มีคุณสมบัตินี้

ในการประกาศตัวแปรในเชลล์ส่วนใหญ่คุณควรใช้ชื่อตัวแปร ( [A-Za-z_][A-Za-z0-9_]*) ตามด้วยเครื่องหมายเท่ากับ (และไม่มีการเว้นวรรครอบเครื่องหมายเท่ากับ) จากนั้นค่า (ควรอ้างอิงโดยอ้างว่าเป็นค่าที่ง่าย[A-Za-z0-9_]+) ตัวอย่างเช่น:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1

5

ใช้การส่งออก

export ABC="123"

เพื่อตรวจสอบว่ามันตั้งไว้ใช้

env

และ / หรือ

env | grep ABC

หากต้องการเพิ่มอย่างถาวรให้เพิ่มสิ่งนี้ลงใน~/.bashrcไฟล์ของคุณ

export ABC="123"

6
เขาต้องการที่จะรู้ว่าร้อนเพื่อกำหนดอย่างถาวรคือในไฟล์ที่จะนำความหมาย
Matteo

1
ไม่ทำงาน เมื่อฉันออกจากระบบตัวแปรจะหายไป ฉันต้องการมันตลอดเซสชัน

1
คุณหมายถึงpermenateและไม่permenently: D
whoami

ดูการแก้ไขสำหรับbashrc
whoami

5
คืออะไรpermenate? คุณหมายถึงpermanentอะไร
SSH

3

คำสั่งที่แน่นอนคือ:

echo 'export ABC = "123"' >> ~/.profile

4
แน่นอน? อย่างจริงจัง? เชลล์ (a) อ่านอะไร~/.profileและ (b) อนุญาตพื้นที่ก่อนและหลัง=?
G-Man

1

วิธีที่ดีที่สุดสำหรับฉันคือการแก้ไขไฟล์. bashrc ในเชลล์ BASH

ใช้สิ่งนี้เป็นตัวอย่าง:

  1. เปิดไฟล์. bashrc ของคุณ
  2. เพิ่มบรรทัดนี้:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    เช่น : export HOME = "/home/user/"

    จำไว้ว่าให้ใช้""เป็นการใช้งาน' 'จะไม่ทำงานและไฟล์ bashrc ของคุณจะรายงานข้อผิดพลาดขณะทำการจัดหา

  3. แหล่งที่มาในเซสชั่นปัจจุบัน

ฉันพยายามแก้ไขไฟล์ / etc / environment แต่มันไม่อนุญาตให้ฉันสร้างตัวแปรสภาพแวดล้อมใหม่และเมื่อฉันหาที่มามันได้รับแจ้งข้อผิดพลาดว่าไม่พบตัวแปรที่กำหนด

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