Ortam değişkenlerini ayarlamak için kabuk betiği


84

Değişkenleri dışa aktarmak için bir kabuk betiği yazmak istiyorum.

Aşağıda senaryoyu listeledim.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

Ancak bu düzgün çalışmıyor gibi görünüyor. Bunun yerine komutları kabuk isteminde ayrı ayrı yürütmem gerekiyor.


Hangi kabuğu kullanıyorsunuz (ör. Bash, ksh, sh)
Tom



Yanıtlar:


49

Lütfen bize komut dosyasının daha fazla bölümünü gösterin ve bize hangi komutları tek tek yürütmeniz gerektiğini ve basitçe yapmak istediğinizi söyleyin.

Bu arada, değişkenleri genişletmek için tek tırnak yerine çift tırnak kullanmanız gerekir:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

Tek bir komutun sonundaki noktalı virgül de gereksizdir.

Şimdiye kadar:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Şunlarla suçalıştırabilirsiniz:

su -c 'sh /path/to/script.sh'

Not: OP, bir kabuk komut dosyası kullanarak etkileşimli bir kabukta dışa aktarma değişkenlerinin nasıl oluşturulacağına ilişkin adımları açıkça sormuyordu. Sadece senaryosunun en fazla değerlendirilmesini istedi. Senaryonun nasıl kullanılacağına dair ayrıntılardan bahsetmedi. Etkileşimli kabuk kullanarak .veya kullanarak olabilirdi source. Bağımsız sourcebir komut dosyası olabilir veya başka bir komut dosyasından alınmış olabilir . Ortam değişkenleri, etkileşimli mermilere özel değildir. Bu cevap problemini çözdü.


1
HI konsolebox !! Çok teşekkür ederim . ama farkı anlamadım .. export PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" çift tırnak içinde. & CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' tek tırnak içinde dışa aktarın. u tarafından değiştirilen komut dosyası iyi çalışıyor.
Prag Rao

@PragRao Paramater genişletmesi tek tırnak içinde gerçekleşmez. Alıntı yapmayla ilgili ayrıntıları burada daha fazla açıklayabilirsiniz .
konsolebox

3
@konsolebox soru adı "Ortam değişkenlerini ayarlamak için kabuk betiği" gibi geliyor - topluluğun çoğu bu soruyu sadece mevcut kabuktan ( sourceveya .) bu tür bir komut dosyasını çalıştırma sorununu çözmek için buldu . OP'nin sorusuna tam olarak cevap verdiğiniz için minnettarım, ancak bu konuyu google'dan buldum ve bir sonraki cevap bana sizinkinden daha fazla yardımcı oldu. İkinci cevaba olumlu oylar ( fikrimi onaylayın sourceve .onaylayın ...
avtomaton

@avtomaton Yine, konu Google'da bulan diğer insanlarla ilgili değil. Bu sadece sorunun orijinal yaklaşımıyla ilgili. Bir sorunun nasıl değiştirilmesi gerektiği veya bir cevabın nasıl sunulması gerektiği konusunda endişeleriniz varsa, bunu meta olarak tartışmayı düşünün.
konsolebox

230

Komut dosyasını şu şekilde çalıştırmanız gerekir: source veya steno.

source ./myscript.sh

veya

. ./myscript.sh

Bu, mevcut kabuk içinde çalışacak ve komut dosyası tarafından oluşturulan veya değiştirilen tüm değişkenlerin komut dosyası tamamlandıktan sonra kullanılabilir olmasını sağlayacaktır.

Komut dosyasını yalnızca dosya adını kullanarak çalıştırmak, komut dosyasını ayrı bir alt kabukta çalıştırır.


2
kaynak kullanarak ./setenv.sh -: Kaynak bulunamadı hatası verir. ve kullanarak. ./setenv.sh setenv.sh dosyasını açamıyor verir. Lütfen bana bu konuda yardım eder misin? Teşekkürler
Vishal

1
Bir saat boyunca kafamı kaşıyordum, neden o lanet olası ihracatçılar (zsh) denediler typeset -gx, ihraç ettiler vs. ve wtf'mi alıyorlardı? an ve henüz - bir alt kabuğun kendi kapsamı ile yürütüldüğünü bilmiyordum. öfke bayan-yönetim yaklaşan benim gün kaydetmesini teşekkürler
İnoperabl

1

Hata ayıklama modunda çalıştırmak için komut dosyasını kaynak = olarak çalıştırın.

source= ./myscript.sh

0

İle çözemiyorum source ./myscript.sh. Kaynakta hata bulunamadı diyor.
Kullanırken de başarısız oldu . ./myscript.sh. Myscript.sh dosyasını açamaz.

Bu yüzden benim seçeneğim onu ​​bir sonraki komut dosyasında çağrılmak üzere bir metin dosyasına koymak.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Tnen ne zaman ihtiyaç duyulursa çağırır:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
Değiştirerek (dışa aktarma ifadeleriyle) myscript.shadında bir dosya oluşturabilir environment.sh, ardından environment.shihtiyaç duyulduğunda while döngüsü yerine yalnızca kaynak oluşturabilirsiniz.
slajma
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.