2014-11-26 8 views
8

Bir katedilebilen kabuk komut dosyası olarak çıktı ortamınızı trivially bir çalıştırılabilir kabuk komut dosyası olarak çıktı env ...nasıl ben daha sonra başka bir komut ...</p> <pre><code>env > my_env </code></pre> <p>kullanılarak

set -a 
source my_env 

Bu en önemsiz durumlar için çalışır, ancak herhangi bir özel karakter veya boşluk varsa env.

Yukarıdaki komut dosyasını nasıl düzeltebilirim? a='"'"'" gibi şeylerle çalışır?

+1

gibi görünüyor ve bunun ebeveynin ortamı biraz değiştirir değil. 'kaynak my_env' daha mantıklı, ancak bu' chmod + x' gerektirmez. –

+0

iyi nokta + x sesini çıkartarak gürültü –

cevap

4

Kullanım set yerine env:

○ → set | grep LESS 
LESS=-R 
LESSCLOSE='/usr/bin/lesspipe %s %s' 
LESSOPEN='| /usr/bin/lesspipe %s' 

○ → env | grep LESS 
LESS=-R 
LESSOPEN=| /usr/bin/lesspipe %s 
LESSCLOSE=/usr/bin/lesspipe %s %s 

teşekkür ederiz şöyle SADECE ortam değişkenleri almak için bunu yapabilirsiniz this similar question için:

○ → (set -o posix; set) | grep LESS 
LESS=-R 
LESSCLOSE='/usr/bin/lesspipe %s %s' 
LESSOPEN='| /usr/bin/lesspipe %s' 

sadece yazdırmalısınız bu devi deneyin "bozulmamış" bir kabuktan farkı. YMMV:

diff --old-line-format='%L' --unchanged-line-format= --new-line-format= \ 
    <(bash -c 'set -o posix; set' | sort) \ 
    <(env -i bash -c 'set -o posix; set' | sort) 
4

şu doğru içeriği ne olursa olsun değerlerini kaçmak için bash en printf %q kullanır. İçerdiği çıktılar bash olduğu için, söz konusu işletim sistemi Linux tarafından sağlanan /proc/self/environ tesisini desteklediği sürece içeriği - alıntılar, satır sonları, vb. NUL-sınırlı bir akış olarak çevre. Uygun olduğu yerlerde $'\n' gibi özel teklif formlarını kullanır, böylece çıktısı saf POSIX tercümanları tarafından onurlandırılamaz. Eğer mevcut kabuk ortamı değiştirmek istiyorsanız kaynağına çıktı isteyeceksiniz

#!/usr/bin/env bash 
while IFS= read -r -d '' kvname; do 
    k=${kvname%%=*} 
    v=${kvname#*=} 
    printf '%q=%q\n' "$k" "$v" 
done </proc/self/environ 

Not harici yürütülebilir olarak çalıştırın değil. Kaynak oluşturmadan önce set -a'u istemiyorsanız, biçimlendirme dizgisine giden bir export ekleyin.

+0

Sadece denedim (set -o posix; export) ve aynı zamanda hile yapmak gibi görünüyor, bu benim için patlayacak mı? –

+0

Sanırım orada set -o posix'e ihtiyacın var; 'ihracat' tek başına muhtemelen iyidir. Yukarıdaki kodun doğal olarak kabuk tabanlı çözümlerden daha iyi bir şey olması, * geçerli olmayan kabuk değişkenleri (ör. Kabuk olmayan yasal adlarla kabuk dışı diller tarafından ayarlandığında) * olmayan ortam değişkenlerini açığa çıkarmasıdır. ama davranış biçimleri ... her neyse çok değişkendir. –

+1

@SamSaffron, ... 'export' (ya da daha açık olmak istiyorsanız, 'export -p ') için belgeleri okuyarak, çıktılarını kabuk güvenli olduğunu _guaranteeing_ görmüyorum dedi. printf '% q'' * güvenliği * garanti eder. Öte yandan, '/ proc''ye güvenmek, taşınabilirliğinizi azaltmak için garantilidir, bu nedenle bu yaklaşımın kesinlikle tuzakları vardır ve baktığım bash versiyonlarındaki uygulama, bu belgede garanti edilmemesine rağmen tamamen güvenli görünüyor. . –

3

En basit çözüm çok olsa da, en kısa sürede o çıkar çalışan bitti gibi verilen yapmaz o senaryoyu Running

export -p > my_env 
İlgili konular