TL; DR: è possibile utilizzare sudo -iper eseguire una funzione definita /root/.bashrc(ma non un alias) e inoltre avere accesso alle variabili esportate da quel file:
argomenti del comando sudo -i
Tuttavia, gli alias non funzionano lì, ma puoi facilmente convertirli in funzioni se desideri renderli disponibili sudo -i.
Continua a leggere per un'analisi completa e maggiori dettagli.
Ci sono alcuni problemi qui, alcuni su come funziona sudo e altri su come funziona bash stesso ...
Per impostazione predefinita, sudocercherà solo per i comandi e consentirà di bypassare il guscio, così semplicemente in esecuzione sudo llsarà solo lavoro se c'è un lleseguibile in una delle directory in $PATH. Quindi, per usare gli alias (o le funzioni) è necessario assicurarsi che una shell sia invocata come parte del processo.
Un modo sarebbe quello di eseguire qualcosa di simile sudo sho sudo bash, sebbene moderno sudo(lo sto testando su sudo 1.8.19p1) ha opzioni -se -iper quello scopo.
Quindi un tentativo sarebbe qualcosa di simile sudo -s ll(che equivale a sudo bash -c 'll', supponendo che tu $SHELLsia Bash, che sembra essere il caso in base a quello che rcfilehai citato.) Ma neanche questo funziona, poiché avvia la shell in modo non interattivo, modalità non di accesso, che non legge nessuno dei suoi file di avvio. È essenzialmente lo stesso di scrivere uno script di shell e utilizzarlo #!/bin/bashper eseguirlo. Gli alias (e le funzioni) che hai nel tuo ~/.bashrcnon saranno accessibili da quello script ...
Quindi la prossima -iopzione è che crea una shell di login. Questo è il più promettente, dal momento che sarà leggere i file di avvio! Eppure, sudo -i ll(equivalente a sudo bash -l -c 'll') non funzionerà ancora. Quindi come è possibile, dato che ha letto la definizione lldell'alias?
Bene, la prossima spiegazione qui è che, per impostazione predefinita, bash non espanderà gli alias, tranne quando la shell è interattiva ... Questa shell avviata da sudo -i(o bash -l) è una shell di login , ma non è ancora interattiva.
Quindi il prossimo passo è ottenere una shell interattiva , che quindi funzioni :
sudo bash -i -c 'll'
(Avere sia login che interattivo va bene, ovviamente, bash -l -i -c ...funzionerà.)
Un'altra alternativa è continuare a utilizzare una shell di accesso (non interattiva) ma chiederle esplicitamente di espandere gli alias, quindi funzionerà anche:
sudo bash -l -O expand_aliases -c 'll'
(Il caso in cui bash era interattivo non aveva bisogno di una shell di accesso , poiché questo è sufficiente per leggere i file di inizializzazione, ma questo deve -lleggerli.)
Queste sono righe di comando abbastanza lunghe ... E richiedono anche che tu citiate l'intero comando shell, quindi se stai chiamando un alias con argomenti, dovrai trasformare tutto ciò in una stringa ... Quindi è un po ' goffo da usare ...
Nota che prima stavo parlando di alias e funzioni ... Era apposta, dal momento che le funzioni in realtà sono molto più convenienti qui. Non hai bisogno di nulla di speciale (come avere una shell interattiva o impostare un'opzione specifica) per eseguire funzioni su una shell, purché tu stia approvando la loro definizione.
Quindi, se definissi lluna funzione anziché un alias, saresti in grado di usarla direttamente con il -icollegamento di sudo :
sudo -i ll
E se hai una riga di comando più lunga, con argomenti, puoi passarli direttamente anche qui:
sudo -i ll -C -R /etc
(Confronta con sudo bash -i -c 'll -C -R /etc'.)
Le funzioni sono anche molto più flessibili e in genere più facili da mantenere ... Di solito è facile convertire un alias in una funzione, l'unico avvertimento è quello di utilizzare sempre "$@"dove ti aspetteresti di prendere argomenti extra (in genere alla fine del alias.)
Ad esempio, questo alias:
alias ll='ls $LS_OPTIONS -l'
Potrebbe essere trasformato in questa funzione:
ll () {
ls $LS_OPTIONS -l "$@"
}
Sono, per la maggior parte degli scopi, equivalenti. E, come accennato in precedenza, la funzione dovrebbe essere accessibile direttamente da sudo -i, quindi questo è un ulteriore vantaggio.
Spero che questa risposta e spiegazione siano utili!
/root/.bashrcma in realtà ciò che la Q sta cercando sono gli alias da questo file - questo non è possibile per questo - unix.stackexchange.com/questions/1496/… .