Domanda

Nel mio script bash, ho eseguire alcuni comandi come un altro utente. Voglio chiamare una funzione bash utilizzando su.

my_function()
{
  do_something
}

su username -c "my_function"

Lo script di cui sopra non funziona. Naturalmente, my_function non è definito all'interno su. Un'idea che ho è quello di mettere la funzione in un file separato. Hai un'idea migliore che evita di fare un altro file?

È stato utile?

Soluzione

È possibile esportare la funzione per renderlo disponibile alla subshell:

export -f my_function
su username -c "my_function"

Altri suggerimenti

Si potrebbe consentire 'sudo' nel vostro sistema, e l'uso che, invece.

Si deve avere la funzione nello stesso ambito in cui lo si utilizza. Quindi, o inserire la funzione all'interno delle virgolette, o mettere la funzione a uno script separato, che quindi si esegue con su -c.

Un altro modo potrebbe fare parte dei casi e passando un parametro allo script eseguito. Esempio potrebbe essere: Prima di tutto un file chiamato "script.sh". Poi inserire questo codice in esso:

#!/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

Dopo aver aggiunto il codice di cui sopra eseguire questi comandi per vederlo in azione:

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

Per fare questo lavoro avete richiesto avrete solo bisogno di eseguire

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

e tutto dovrebbe andare bene a lavorare. Spero che questo aiuti:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top