2010-09-16 17 views
10

Bash komut dosyasımda, başka bir kullanıcı olarak bazı komutlar yürütüyorum. su kullanarak bir bash işlevini çağırmak istiyorum.Bash işlevi su komutuyla çalışan

my_function() 
{ 
    do_something 
} 

su username -c "my_function" 

Yukarıdaki kod çalışmıyor. Tabii ki my_functionsu içinde tanımlanmamıştır. Sahip olduğum bir fikir, işlevi ayrı bir dosyaya koymak. Başka bir dosya oluşturmayı engelleyen daha iyi bir fikrin var mı?

cevap

11

Sen alt kabuğa için kullanılabilir hale getirmek için fonksiyonu verebilirsiniz:

export -f my_function 
su username -c "my_function" 
2

Sisteminizde 'sudo' özelliğini etkinleştirebilir ve bunun yerine bunu kullanabilirsiniz.

+0

sudo etkin değil. Sistem yöneticisi bunu etkinleştirmez. –

+2

Bunu sudo ile nasıl yapıyorsunuz? Bu işlevi ihraç ettikten sonra bile basit bir 'sudo my_function' çalışmaz. – michas

1

İşlev, işlevi, kullandığınız aynı alanda olmalıdır. Yani ya işlevi tırnak içine yerleştirin ya da işlevi su-c ile çalıştırdığınız ayrı bir betiğe yerleştirin.

+0

Aynı betiğin dışında su aramak istiyorum. Diğer senaryo benim de fikrimdi. –

0

bir başka yolu durumlarda yapma ve idam komut dosyasına bir parametre geçirerek edilebilir. Örnek şöyle olabilir: Önce "script.sh" adlı bir dosya oluşturun. Sonra buna şu kodu ekleyin:

#!/bin/sh 

my_function() { 
    echo "this is my function." 
} 

my_second_function() { 
    echo "this is my second function." 
} 

case "$1" in 
    'do_my_function') 
     my_function 
     ;; 
    'do_my_second_function') 
     my_second_function 
     ;; 
    *) #default execute 
     my_function 
esac 

yukarıdaki kodu ekledikten sonra eylem görmek için bu komutları çalıştırın: size sadece çalıştırmak gerekir gerektiği gibi

[email protected]:/# chmod +x script.sh #This will make the file executable 
[email protected]:/# ./script.sh   #This will run the script without any parameters, triggering the default action.   
this is my function. 
[email protected]:/# ./script.sh do_my_second_function #Executing the script with parameter 
this function is my second one. 
[email protected]:/# 

Bu işi yapmak için

su username -c '/path/to/script.sh do_my_second_function' 

ve her şey iyi çalışıyor olmalıdır. Umarım bu yardımcı olur :)