ตัวแปรสภาวะแวดล้อมใน / etc / environment พร้อมเครื่องหมาย pound (hash) ในค่า


10

ใน Ubuntu 12.04 ฉันมีตัวแปรสภาพแวดล้อมที่กำหนดไว้/etc/environmentดังนี้:

FOO="value_before#value_after"

เมื่อฉันเข้าสู่เซิร์ฟเวอร์เพื่อตรวจสอบค่าฉันจะได้รับสิ่งนี้:

$ env | grep FOO
FOO=value_before

ฉันคาดเดาว่ามัน#เป็นการแสดงความคิดเห็นและลอกออกอย่างไรก็ตามงานนี้:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

ฉันพยายามหลบหนี#แบบนี้:

FOO="value_before\#value_after"

แต่มันใช้งานไม่ได้ แต่ฉันเพิ่งได้รับสิ่งนี้:

FOO=value_before\

ความคิดเห็นใด ๆ เกี่ยวกับวิธีทำให้แฮชได้รับการปฏิบัติเหมือนเป็นส่วนหนึ่งของมูลค่า ความช่วยเหลือใด ๆ จะดีมาก

ค่าที่ฉันได้ลองใน/etc/environmentไฟล์:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

และชุดค่าผสมต่าง ๆ ข้างต้น สิ่งเหล่านี้จำนวนมากจะทำงานเมื่อคุณเพิ่งตั้งค่าเหล่านั้นในเปลือก แต่ดูเหมือนว่าพวกเขาจะไม่ทำงานใน/etc/environmentไฟล์

คำตอบ:


5

นี่คือการอ่านโดยโมดูล pam_env ระบุว่าโมดูล pam_env คาดหวังว่าพวกเขาจะเป็นคู่ "ง่าย" KEY = VALUE (ไม่จำเป็นต้องมีเครื่องหมายคำพูด) และยังสนับสนุนความคิดเห็นที่ระบุโดย # มันจะถือว่า # และสิ่งใดก็ตามที่ตามมาใน VALUE เป็นความคิดเห็น นอกจากนี้โปรดทราบว่ามันไม่สนับสนุนแนวคิดใด ๆ ของการหลบหนี

นี้สามารถเห็นได้ในตัวอย่างต่อไปนี้จากฟังก์ชัน _parse_env_file ในpam_env.c

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';

ข้อมูลข้างต้นเดินลักษณะของส่วนค่าแต่ละจนกว่าจะพบ\n, หรือ# จากนั้นก็เขียนทับตัวละครที่มี\0\0

สิ่งนี้จะตัดการติดตาม#และทุกสิ่งที่ตามมาอย่างมีประสิทธิภาพ หมายเหตุ:นี่เป็นคุณสมบัติที่ไม่ใช่ข้อผิดพลาด มันเป็นคุณสมบัติความคิดเห็น

ดังนั้น ณ จุดนี้คุณไม่สามารถมีค่าใน/etc/environmentที่มี#หรือ\nหรือ\0ในช่วงกลางของค่า นอกจากนี้ยังดูเหมือนว่าจากรหัสที่ปุ่มต้องเป็นตัวเลขและตัวอักษร


โอ้โห! ขอบคุณสำหรับคำอธิบายโดยละเอียดฉันได้ทำเครื่องหมายว่านี่เป็นวิธีการแก้ปัญหาที่ยอมรับได้
Jaymon

3

ฉันไม่สามารถหาวิธีแก้ไขข้อ จำกัด นี้ได้/etc/environmentเอกสารดูเหมือนจะระบุว่า/etc/environmentเป็นไฟล์สภาพแวดล้อมธรรมดา :

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

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

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

หรืออาจจะไม่ :

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

อย่างไรก็ตามเพื่อหลีกเลี่ยงข้อ จำกัด นี้ฉันได้ย้ายตัวแปรสภาพแวดล้อมทั่วโลกของฉันลงในไฟล์/etc/profile.dตามที่อธิบายไว้ในคำตอบนี้ ฉันยังคงพิจารณาคำถามนี้ไม่ได้ตอบ แต่ฉันต้องการให้แน่ใจว่ามีวิธีแก้ปัญหาที่เชื่อมโยงสำหรับลูกหลาน


1

ไม่มีวิธีใดใน / etc / environment ที่จะหลีกเลี่ยง # (ซึ่งถือว่าเป็นความคิดเห็น) เนื่องจากมันถูกวิเคราะห์โดยโมดูล PAM "pam_env" และถือว่าเป็นรายการคู่ของ KEY = VAL และตั้งค่า สภาพแวดล้อมตาม มันไม่ได้เป็น bash / shell, parser ไม่มีภาษาสำหรับการขยายหรือแปรผันของอักขระ


0

คำพูดเดียว

$ FOO='foo#bar'
$ echo $FOO
foo#bar

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