คำถามติดแท็ก environment-variables

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

5
ตัวแปรเชลล์มีขอบเขตอะไรบ้าง?
ฉันพบปัญหาที่แสดงให้ฉันเห็นว่าฉันไม่ชัดเจนเกี่ยวกับขอบเขตของตัวแปรเชลล์ ฉันพยายามใช้bundle installซึ่งเป็นคำสั่ง Ruby ที่ใช้ค่าของ$GEM_HOMEการทำงาน ผมได้ตั้ง$GEM_HOMEแต่คำสั่งละเว้นค่าที่จนกว่าฉันจะใช้ในขณะที่exportexport GEM_HOME=/some/path ฉันอ่านว่าสิ่งนี้ทำให้ตัวแปร "โลก" อย่างใดอย่างหนึ่ง (หรือที่เรียกว่าตัวแปรสภาพแวดล้อม ) แต่ฉันไม่เข้าใจสิ่งที่หมายถึง ฉันรู้เกี่ยวกับ globals ในการเขียนโปรแกรม แต่ไม่ใช่ในโปรแกรมที่แตกต่าง นอกจากนี้เนื่องจากการตั้งค่าของฉันตัวแปรดังกล่าวใช้เฉพาะกับเซสชันเชลล์ปัจจุบันฉันจะตั้งค่าให้พวกเขาสำหรับพูดกระบวนการ daemonized อย่างไร ตัวแปรเชลล์มีขอบเขตอะไรบ้าง?

5
ตัวแปรสภาพแวดล้อมคืออะไร
ฉันรู้ว่าVARIABLE=valueสร้างตัวแปรสภาพแวดล้อมและexport VARIABLE=valueทำให้พร้อมใช้งานสำหรับกระบวนการที่สร้างโดยเชลล์ปัจจุบัน envแสดงตัวแปรสภาพแวดล้อมปัจจุบัน แต่พวกมันอยู่ที่ไหน สิ่งที่ประกอบด้วยตัวแปรสภาพแวดล้อม (หรือสภาพแวดล้อมสำหรับเรื่องนั้น)?

1
ความแตกต่างระหว่างตัวแปรเชลล์ที่ถูกเอ็กซ์พอร์ตและที่ไม่ได้อยู่ใน bash
Bash ดูเหมือนจะแยกความแตกต่างระหว่างตัวแปรที่ถูกส่งออกและที่ไม่ได้ ตัวอย่าง: $ FOO=BAR $ env | grep FOO $ set | grep FOO FOO=BAR setเห็นตัวแปร แต่envทำไม่ได้ $ export BAR=FOO $ env | grep FOO BAR=FOO $ set | grep FOO BAR=FOO FOO=BAR setเห็นทั้งสองตัวแปร แต่envเห็นเฉพาะตัวแปรที่ส่งออก ฉันรู้ว่านั่นsetคือทุบตี builtin และenvไม่ อะไรคือความแตกต่างระหว่างตัวแปรที่ถูกเอ็กซ์พอร์ตและตัวแปรที่ไม่ใช่?

3
.bash_profile ไม่ได้มีที่มาเมื่อเรียกใช้ su
ฉันมีผู้พูดuser1ซึ่งมีการปรับเปลี่ยนของ.bash_profileหนึ่งของพวกเขาเปลี่ยนแปลงเช่น:PATH export PATH=/some/place:$PATHการเปลี่ยนแปลงนี้จะทำงานได้ดีถ้าฉันเข้าสู่ระบบเป็นหรือทำuser1su - user1 แต่ถ้าฉันพยายามที่จะเรียกใช้คำสั่งผ่านทางsuเป็นrootเช่น: su -c test.sh oracle (มีการทดสอบecho $PATH) ดูเหมือนว่าจะไม่มีการแก้ไขPATH(หรือรูPATHทสำหรับเรื่องนั้น) ฉันได้ลองคัดลอก.bash_profileไป.profileยังไม่มีประโยชน์ ทำไมสิ่งนี้จึงเกิดขึ้น

5
แทนที่ตัวแปรสภาพแวดล้อมในไฟล์ด้วยค่าจริงหรือไม่?
มีวิธีง่าย ๆ ในการทดแทน / ประเมินตัวแปรสภาพแวดล้อมในไฟล์หรือไม่? อย่างสมมติว่าฉันมีไฟล์config.xmlที่มี: <property> <name>instanceId</name> <value>$INSTANCE_ID</value> </property> <property> <name>rootPath</name> <value>/services/$SERVICE_NAME</value> </property> ... ฯลฯ ฉันต้องการแทนที่$INSTANCE_IDในไฟล์ด้วยค่าของINSTANCE_IDตัวแปรสภาพแวดล้อม$SERVICE_NAMEด้วยค่าของSERVICE_NAMEenv var ฉันไม่ทราบว่าจะต้องใช้ vars รุ่นใด (หรือมากกว่านั้นฉันไม่ต้องการอัปเดตสคริปต์หากมีคนเพิ่มตัวแปรสภาพแวดล้อมใหม่ลงในไฟล์ปรับแต่ง) ขอบคุณ!

2
เท่ากับ $ HOME เสมอหรือเปล่า
ฉันรู้ว่าอาจมีการถามก่อนหน้านี้ แต่ฉันไม่พบมันด้วย Google ป.ร. ให้ไว้ เคอร์เนล Linux ไม่มีการกำหนดค่าที่เปลี่ยนแปลง $ HOME ทุบตี จะ~ == $HOMEเป็นจริงหรือ

7
ทำไมตัวแปร PATH แตกต่างกันเมื่อทำงานผ่าน sudo และ su
ใน fedora VM ของฉันเมื่อทำงานกับบัญชีผู้ใช้ของฉันฉันมี/usr/local/binในเส้นทางของฉัน: [justin@justin-fedora12 ~]$ env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin และเช่นเดียวกันเมื่อทำงานsu: [justin@justin-fedora12 ~]$ su - Password: [root@justin-fedora12 justin]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin อย่างไรก็ตามเมื่อเรียกใช้ผ่านsudoไดเรกทอรีนี้ไม่ได้อยู่ในเส้นทาง: [root@justin-fedora12 justin]# exit [justin@justin-fedora12 ~]$ sudo bash [root@justin-fedora12 ~]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin ทำไมเส้นทางที่จะแตกต่างกันเมื่อใช้ผ่านsudo?

5
sudo ถูกตั้งค่าอย่างไรให้ไม่เปลี่ยน $ HOME ใน Ubuntu และจะปิดการทำงานนี้ได้อย่างไร?
บน Ubuntu 12.04 เมื่อฉันsudo -sตัวแปร $ HOME ไม่เปลี่ยนแปลงดังนั้นหากผู้ใช้ปกติของฉันregularuserสถานการณ์จะเป็นดังนี้: $ cd $ pwd /home/regularuser $ sudo -s # cd # pwd /home/regularuser ฉันเลิกใช้ Ubuntu ไปนานแล้วดังนั้นฉันจึงไม่แน่ใจ แต่ฉันคิดว่านี่เป็นพฤติกรรมเริ่มต้น ดังนั้นคำถามของฉันคือ: ไตรมาสที่ 1 สิ่งนี้ทำได้อย่างไร การกำหนดค่าอยู่ที่ไหน ไตรมาสที่ 2 ฉันจะปิดการใช้งานได้อย่างไร แก้ไข: ขอบคุณสำหรับคำตอบซึ่งชี้แจงสิ่งเล็กน้อย แต่ฉันคิดว่าฉันต้องเพิ่มคำถามสองสามข้อเพื่อให้ได้คำตอบที่ฉันกำลังมองหา ไตรมาสที่ 3 ใน Debian sudo -sเปลี่ยนแปลงตัวแปร $ HOME /rootเพื่อ จากสิ่งที่ฉันได้รับจากคำตอบและman sudoกระสุนที่วิ่งไปsudo -sนั้นเป็นที่ได้รับ/etc/passwdใช่ไหม? ไตรมาสที่ 4 …

10
ชื่อตัวแปรของเชลล์มียัติภังค์หรือขีดกลาง (-) หรือไม่?
ฉันไม่สามารถใช้-ตัวแปรในเชลล์ได้ มีวิธีที่จะใช้งานได้หรือไม่เพราะฉันมีหนึ่งสคริปต์ซึ่งขึ้นอยู่กับตัวแปรที่มีชื่อดังกล่าว: $export a-b=c -bash: export: `a-b=c': not a valid identifier $export a_b=c ก่อนโยนข้อผิดพลาดที่กำหนดและครั้งที่สองทำงานได้ดี

3
การส่งออกตัวแปรที่มีจุด (.) อยู่ในนั้น
วิธีการส่งออกตัวแปรที่มีจุดอยู่ในนั้น ฉันได้รับ 'ชื่อตัวแปรที่ไม่ถูกต้อง' เมื่อพยายาม: export my.home=/tmp/someDir -ksh: my.home=/tmp/someDir: invalid variable name แม้แต่การหลบหนี metacharacter dot (.) ก็ไม่ได้ช่วยเช่นกัน $ export my\.home=/tmp/someDir export: my.home=/tmp/someDir: is not an identifier


5
ทำไมฉันต้องตั้งค่า env vars ใน tmux อีกครั้งเมื่อฉันแนบใหม่?
ฉันทำงานบน mac และ ssh / tmux เป็นหลักแนบกับเครื่อง Linux เพื่อทำงานของฉัน ฉันมี ssh-agent กำลังทำงานบนเครื่อง Linux ฉันมี set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" .tmux.confในของฉัน แต่เมื่อใดก็ตามที่ฉันแนบมากับเซสชั่นนี้ฉันต้องทำงาน tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK เพื่อให้หน้าต่าง tmux ใหม่$SSH_AUTH_SOCKตั้งค่าไว้ถูกต้อง ฉันไม่ต้องการทำเช่นนี้ ความคิดใด ๆ ปรับปรุง ฉันคิดว่าฉันอธิบายไม่ได้ดี นี่คือฟังก์ชั่นเชลล์ของฉันเพื่อเปิดเชลล์บนเครื่องระยะไกล: sshh () { tmux -u neww -n ${host} "ssh -Xt ${host} $*" } …

4
ใครตั้งค่าตัวแปรสภาพแวดล้อม $ USER และ $ USERNAME
นอกจากนี้ตัวแปรเหล่านี้จะจับคู่กับชื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันอยู่เสมอหรือไม่ ฉันสามารถสมมติความพร้อมใช้งานในระบบ Unix (- like) อื่น ๆ ได้หรือไม่? ฉันยังสงสัยด้วยว่าทำไมจึงใช้whoamiแทนการอ่านตัวแปรเหล่านี้

3
ใช้ตัวแปรเพื่อจัดเก็บรหัสสีของเทอร์มินัลสำหรับ PS1 หรือไม่
ในของ.bashrcฉันฉันใช้รหัสสีเทอร์มินัล ANSI เพื่อ colorize บิตต่าง ๆ ดูเหมือนว่านี้: PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ ' ที่ไหนvirtual_envและgit_branchฟังก์ชั่นทุบตีสิ่งที่ส่งออกใน stdout ตอนนี้เพื่อให้ง่ายต่อการอ่านและแก้ไข, PS1ฉันต้องการที่จะเก็บรหัสสีในตัวแปรและหมายถึงพวกเขาแทนการฝังพวกเขาโดยตรงใน ดังนั้นฉันจึงมีตัวแปรหลายอย่างเช่นนี้: GREEN="\[\033[32m\]" YELLOW="\[\033[33m\]" RESET="\[\033[0m\]" ฉันต้องการที่จะสามารถเขียนสิ่งที่ชอบ: PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ ' แต่วิธีนี้ใช้ไม่ได้ - รหัสสีจะแสดงขึ้นมาในพรอมต์ราวกับว่ามันกำลังหลบหนี สีที่ทำงานอย่างถูกต้องถ้าผมใช้คำพูดสองแทนแต่แล้วก็พรอมต์เพียงการเปลี่ยนแปลงเมื่อฉันทำPS1source ~/.bashrc ฉันได้พยายามสิ่งอื่น ๆ ที่ผมเคยเห็นคนทำ - การใช้printfและไม่ใช้คำพูดเดียวสำหรับสีวาง\[และ\]ในPS1แทนของตัวแปรสี แต่ไม่มีอะไรน่าจะทำงาน ฉันจะใช้ตัวแปรสำหรับรหัสสีได้อย่างไร

7
มีการโต้แย้งหลายครั้งใน shebang
ฉันสงสัยว่ามีวิธีทั่วไปในการส่งตัวเลือกหลายตัวไปยังโปรแกรมที่เรียกใช้งานได้ผ่านทางสาย shebang ( #!) ผมใช้ NixOS และส่วนแรกของ shebang ในสคริปต์ใด ๆ /usr/bin/envที่ฉันเขียนมักจะ ปัญหาที่ฉันพบคือทุกสิ่งที่เกิดขึ้นหลังจากนั้นถูกตีความว่าเป็นไฟล์หรือไดเรกทอรีเดียวโดยระบบ ตัวอย่างเช่นสมมติว่าฉันต้องการเขียนสคริปต์ที่จะดำเนินการโดยbashในโหมด posix วิธีที่ไร้เดียงสาของการเขียน Shebang จะเป็น: #!/usr/bin/env bash --posix แต่พยายามที่จะรันสคริปต์ผลลัพธ์จะสร้างข้อผิดพลาดต่อไปนี้: /usr/bin/env: ‘bash --posix’: No such file or directory ฉันทราบเกี่ยวกับโพสต์นี้แต่ฉันสงสัยว่ามีวิธีการทั่วไปที่สะอาดกว่าหรือไม่ แก้ไข : ฉันรู้ว่าสำหรับสคริปต์Guileมีวิธีการบรรลุสิ่งที่ฉันต้องการบันทึกไว้ในส่วน 4.3.4ของคู่มือ: #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# เคล็ดลับที่นี่ก็คือบรรทัดที่สอง (เริ่มต้นด้วยexec) …

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