sistem komutlarıyla aynı ada sahip kullanıcı tanımlı işlevleri geçersiz kılma


14

Bu işlev kullanıcılarımın ~ / .bashrc dosyalarından birinde var:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

Kullanıcıların çalıştırması gereken ksh betiğimde şöyle bir satır var:

[[ "$KEEP" = "" ]] && \rm $FILE

Ters eğik çizgi kullanıcı tanımlı takma adlardan kaçarken, komut dosyasının aynı ada sahip kullanıcı tanımlı işlevleri çalıştırmasını durdurmaz. Sonuç olarak, sistem işlevi yerine kullanıcımın rm () işlevi çağrılır.

Bu süper kullanıcı soru sorusunu ve yanıtını buldum , ancak çözünürlük bir sistem komutu için değil, sadece yerleşik bir işlev için geçerlidir.

Bir takma ad veya işlev değil, rm komutunun çağrılmasını sağlamak için en iyi yöntem hangisidir? Rm'nin tam yolunu belirtmeli miyim ve sağlamak istediğim her sistem komutu doğru şekilde yürütülüyor mu? Daha iyi bir yol var mı?

Yanıtlar:


13

commandNormal bash işlevi aramasını atlatmak için kullanabilirsiniz .

command rm

Tahribatsız örnek:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

Alternatif olarak, env(üzerinde belirtilen adla ilk programı yürütmek $PATHveya tam yolu belirterek) çağırın .

/usr/bin/env rm
/bin/rm

teşekkürler, "komut" tam olarak aradığım şey. Yine de yürütülen her sistem komutu için kullanmak zor görünüyor. Sanırım sistem komutunu çalıştırdığınızdan emin olmanın tek ateş yolu tüm yolu belirtmektir. Bununla birlikte, bu yaklaşımla farklı dağıtımlarda komutların aynı yolda olduğu konusunda bankacılık yapıyorsunuz.
acm

@acm Yazdığım gibi, envrotaya da gidebilirsiniz . Ayrıca, örneğin, bir zamanlar her aracın konumunu belirlemek ve bir değişkene saklayabilirsiniz RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Ayrıca komut dosyanızın yürütülme biçimini de değiştirebilirsiniz. Genellikle işlevler ve takma adlar kalıtsal değildir, aksi takdirde komut dosyalarını her zaman bozarlar.
Daniel Beck
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.