Bir var benzer bir soru bu örneğin değiştirmek istiyorum 'sarma' senaryosu ile fırsatlar cd
yerleşiğini çağıran bir komutla cd
.
Ancak, shellshock ve arkadaşlarının ışığında ve bash'ın çevreden işlevleri aldığını bilerek, birkaç test yaptım ve yerleşik kodumu güvenli bir şekilde çağırmak için bir yol bulamıyorum cd
.
Bunu düşün
cd() { echo "muahaha"; }
export -f cd
Bu ortamda kullanarak çağrılan komut dosyaları cd
bozulur (benzer bir şeyin etkilerini göz önünde bulundurun cd dir && rm -rf .
).
Bir komutun türünü (uygun olarak adlandırılır type
) kontrol eden komutlar ve bir işlev ( builtin
ve command
) yerine yerleşik sürümü yürütme komutları vardır . Ancak, bak ve bunlar, fonksiyonlar kullanılarak da geçersiz kılınabilir
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Aşağıdakileri verecektir:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Tüm ortamı temizlemeden bash'ı yerleşik komutu kullanmaya zorlamak veya en azından bir komutun yerleşik olmadığını algılamanın bir yolu var mı?
Birisi ortamınızı kontrol ederse muhtemelen zaten vidalandığınızı anlıyorum, ancak en azından takma adlar için, takma adını \
önüne ekleyerek çağırma seçeneğiniz var .
env
bir işlev olarak yeniden tanımlanmamışsa. Bu çok korkutucu. Öncelikle özel karakterlerin yardımcı olacağını düşündüm - kaynağa /
kullanarak .
vb. İçeren tam yolla çağrı . Ancak bunlar işlev adları için de kullanılabilir! Sen edebilirsiniz İstediğiniz fonksiyonu yeniden tanımlamak, ancak orijinal komutunu çağırarak geri almak zordur.
#/bin/sh
bu komut dosyasını varsayılan etkileşimli kabuk değilse yazın.
env
önce şu komutu kullanarak komut dosyanızı çalıştırabilirsiniz :env -i <SCRIPT.sh>