Ravi'nin cevabını tamamlamak istiyorum :
Bu davranış, Ubuntu'ya (ve muhtemelen en fazla türetilmiş dağıtımlara) özgüdür, çünkü varsayılan ~/.bashrc
dosyanız kısa devre, Ubuntu 18.04 ile başlar, örneğin:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Bu, etkileşimli olmayan bir kabukta çalışıyorsa, tüm komut dosyaları etkileşimli olmayan bir kabukta çalıştırıldığından betiğinizde olduğu gibi dosyanın değerlendirmesini durduracak ve daha sonra source
bu özelliği devralacaksınız.
eval
hile
Ubuntu'yu geçici olarak çözmek için özellikle kullanmak eval
yerine çirkin bir saldırı buldum source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Sadece birkaç ilk satırı atlar ve geri kalanının değerlendirmesini yapar, ~/.bashrc
böylece kalan değerlendirilir ve mevcut yürütmeyi değiştirir.
Sihirli bir sayı olduğunu ve Ubuntu sürümlerinde çalışmayabileceğini unutmayın; fakat az çok bilinen sistemler için betikler hazırlıyorsanız, iyi bir çözüm olabilir.
Bir meraklısı çözümü, değerlendirmeyi durduran belirli bitleri hedeflemek için regex kullanmayı içerebilir.
Shebang alternatif
Bazı senaryolarda daha iyi çalışabilir diğer alternatif bir bayrak ekleyerek interaktif kabuğunda çalıştırmak için komut zorluyor shebang :
#!/bin/bash -i
Birkaç şeyin farkında olun:
- Öyle daha iyi bir uygulama kullanmak için
#!/usr/bin/env bash
formu ancak bu yolu argümanlarla kabuğunu başlayamaz .
- Kullanılması
-i
yükleyerek, örneğin, sonuçları o kendi kümesi vardır, bunlar arasında, programlar kullanıcı etkileşimi için isteyecektir ve bu genellikle komut dosyaları için tasarlanmamıştır deb
komut dosyasını durabilir paketleri dpkg configure
ister .
- Başlangıçta bu özelliği kullanmaya
set -i
ve set +i
özelliği ihtiyaç duyduğum yerde açıp kapatmaya çalıştım, ancak bu işe yaramadı .