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 ~/.bashrcdosyanı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 sourcebu özelliği devralacaksınız.
eval hile
Ubuntu'yu geçici olarak çözmek için özellikle kullanmak evalyerine ç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, ~/.bashrcbö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 bashformu ancak bu yolu argümanlarla kabuğunu başlayamaz .
- Kullanılması
-iyü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 debkomut dosyasını durabilir paketleri dpkg configureister .
- Başlangıçta bu özelliği kullanmaya
set -ive set +iözelliği ihtiyaç duyduğum yerde açıp kapatmaya çalıştım, ancak bu işe yaramadı .