--Rcfile ve -c ile yeni bash kabuğunda çalışan komut


4

Aşağıdaki komutu çalıştırıyorum ve BARoluşturduğum yeni kabuk ilk $FOOönce çalıştırılacak olan .mybashrc'yi çalıştıracağı için beni döndürmesini beklerdi echo $FOO.

bash --rcfile .mybashrc -c 'echo $FOO'

.mybashrc:

export FOO="BAR"

Ancak sonuç boştur. Ne yanlış gitti?

Yanıtlar:


7

Varsayılan olarak, etkileşimli olmayan bashyürütmeler .bashrc, --rcfileseçeneğinizin hedefi gibi başlatma dosyalarını yüklemez . manSayfada açıklandığı gibi :

An interactive shell is one started without non-option arguments and without
the -c option whose standard input and error are both connected to terminals
... or one started with the -i option.

Böylece bashetkileşimli bir kabuk gibi davranmaya zorlayarak istediğiniz davranışı elde edebilirsiniz -i:

bash --rcfile .mybashrc -ci 'echo $FOO'

Bu işe yarar, ancak görünüşe göre bir init betiğinden (bulut bir VM'de) başlatıldığında değil. Bu durumda, "bu kabuğunda iş kontrolü yok" hatası veriyor, belki de TTY yok. Kabuk etkileşimli olmadan bir rcfile kullanmanın bir yolu var mı?
z0r

2
@ z0r Etkileşimli olmayan, giriş yapmayan bashkabuklar, içinde belirtilen dosyanın içeriğini yürütmelidir $BASH_ENV.
dg99,

Harika, işe yarıyor. Kullanırken dikkat edilmesi gereken bir şey BASH_ENV: gibi alt mermi BASH_ENV=./testrc bash -c './test.sh'başlarsanız, o zaman rcfile kararsız sürece, iki kez yürütülür BASH_ENV.
z0r

@ z0r Muhtemelen #!başında bir shebang ( ) vardır test.sh, yani yazdığınız gibi emriniz iki kez bash'ı çağırıyor, ve böylece testrc iki kez kaynaklanıyor. Komutunuzu ya BASH_ENV=./testrc bash ./test.shda olarak değiştirmelisiniz BASH_ENV=./testrc ./test.sh.
dg99

Haklısın, ancak (bu testin dışında) rc dosyasını kontrol etmiyorum. Sınırsız özyinelemeye neden olacak bir alt kabuğun kendisini yaratacağından endişeliyim. Mevcut çözümüm, BASH_ENVbaşlangıçta belirsizleşen ve daha sonra başka bir ortam değişkeni tarafından belirtilen hedefi sağlayan bir sarmalayıcı rc dosyasına sahip olmak .
z0r
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.