/ Etc / ortamındaki ortam değişkeni değerde kare (karma) işaretiyle


10

Ubuntu 12.04'te şöyle tanımlanmış bir ortam değişkeni var /etc/environment:

FOO="value_before#value_after"

Değeri denetlemek için sunucuya ssh, bunu alıyorum:

$ env | grep FOO
FOO=value_before

Sanırım #bir yorum olarak tedavi ve sıyırma, ancak, bu çalışır:

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

#Böyle kaçmayı denedim :

FOO="value_before\#value_after"

Ama bu işe yaramıyor, bunun yerine sadece şunu alıyorum:

FOO=value_before\

Hash'in değerin bir parçası olarak nasıl ele alınacağına dair herhangi bir fikir var mı? Herhangi bir yardım çok iyi olurdu.

/etc/environmentDosyada denediğim değerler :

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'

Ve yukarıdakilerin diğer çeşitli kombinasyonları. Bunların birçoğu normalde onları kabuğa koyduğunuzda çalışır. Ancak /etc/environmentdosyada çalışmıyor gibi görünüyorlar .

Yanıtlar:


5

Bu pam_env modülü tarafından okunur. Pam_env modülünün "basit" KEY = VALUE çifti olmasını beklediği (tırnak işaretleri gerektirmediği) ve # ile tanımlanan yorumları desteklediği göz önüne alındığında, bir # ve bir VALUE içinde onu takip eden her şeyin bir yorum olduğunu varsayar. Ayrıca, herhangi bir kaçış kavramını desteklemediğini unutmayın.

Bu, aşağıdaki snippet'te pam_env.c'deki _parse_env_file işlevinden görülebilir .

/* 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';

Yukarıdaki snippet \n, bir #veya veya bulana kadar VALUE bölümünün her karakterini yürür \0. Daha sonra bu karakterin üzerine a ile yazar \0.

Bu etkili #ve takip eden her şeyi çıkarır. Not: Bu bir hata değil bir özelliktir . Yorum özelliği.

Bu nedenle, bu noktada değerin /etc/environmenta #veya a \nveya \0ortasında bulunan değerleriniz olamaz . Ayrıca koddan tuşların alfa-sayısal olması gerektiği gibi görünüyor.


Vay, çiviledim! Ayrıntılı açıklama için teşekkürler, bunu kabul edilen çözüm olarak işaretledim.
Jaymon

3

Ben bu sınırlama etrafında bir yol bulmak mümkün değildi /etc/environmentdokümantasyon durumuna görünüyor, /etc/environmentbir olan basit bir ortam dosyası:

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

Bu \, belgelerdeki diğer yerlere rağmen bunun mümkün olduğunu söylese de , tırnak işaretleri veya karakter kullanarak değerlerden kaçmanıza izin vermeyeceği anlamına gelebilir :

(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 ""

Ya da belki :

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.

Her neyse, bu sınırlamayı aşmak için, global ortam değişkenlerimi bu cevapta tartışıldığı/etc/profile.d gibi bir dosyaya taşıdım . Bu soruyu hala cevapsız olarak görüyorum, ancak gelecek nesiller için bağlantılı bir çözüm olduğundan emin olmak istedim.


1

/ Etc / ortamında, PAM modülü "pam_env" tarafından ayrıştırıldığı için #'dan (yorum olarak işlem gördüğü gibi) kaçmak için bir yol yoktur ve KEY = VAL çiftlerinin basit bir listesi olarak davranır ve buna göre çevre. Bu bash / shell değil, ayrıştırıcının değişken genişletme veya kaçan karakterler yapmak için dili yok.


0

Tek tırnak.

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

1
Bu denediğim ilk değerlerden biriydi, kabuğunda çalışırken, ne yazık ki, işe yaramıyor /etc/environment, sorumu denediğim bazı değer örnekleri ile güncelledim.
Jaymon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.