TL; DR: Você pode usar sudo -i
para executar uma função definida /root/.bashrc
(mas não um alias) e também ter acesso a variáveis exportadas desse arquivo:
sudo -i command arguments
Os aliases não funcionam lá, mas você pode facilmente convertê-los em funções se quiser disponibilizá-los para sudo -i
.
Leia para uma análise completa e mais detalhes.
Existem alguns problemas aqui, alguns em como o sudo funciona e alguns em como o próprio bash funciona ...
Por padrão, sudo
procurará apenas por comandos e ignorará o shell, portanto, simplesmente executar sudo ll
só funcionará se houver um executável ll
em um dos diretórios em $PATH
. Então, para usar aliases (ou funções), você precisa ter certeza de que um shell é invocado como parte do processo.
Uma maneira seria executar algo como sudo sh
ou sudo bash
, embora o moderno sudo
(estou testando isso no sudo 1.8.19p1) tenha opções -s
e -i
para essa finalidade. / p>
Portanto, uma tentativa seria algo como sudo -s ll
(o que equivale a sudo bash -c 'll'
, supondo que seu $SHELL
seja Bash, o que parece ser o caso com base no rcfile
que você mencionou.) Mas isso não Não trabalhe também, pois ele inicia o shell em um modo não interativo, não interativo, que não lê nenhum de seus arquivos de inicialização. É essencialmente o mesmo que se você escrevesse um script de shell e usasse #!/bin/bash
para executá-lo. Os aliases (e funções) que você tem em seu ~/.bashrc
não estarão acessíveis a partir desse script ...
O próximo passo é a opção -i
, que cria um shell de login. Isso é mais promissor, já que irá ler seus arquivos de inicialização! E ainda assim, sudo -i ll
(equivalente a sudo bash -l -c 'll'
) ainda não funcionará. Então, como isso é possível, dado que fez ler a definição do ll
alias?
Bem, a próxima explicação aqui é que, por padrão, o bash não expande aliases, exceto quando o shell é interativo ... Este shell iniciado por sudo -i
(ou bash -l
) é um login shell, mas ainda não é interativo.
O próximo passo é obter um shell interativo , que então funciona :
sudo bash -i -c 'll'
(Ter ambos login e interativo também é bom, é claro, bash -l -i -c ...
funcionará.)
Outra alternativa é continuar usando um shell login (não interativo), mas solicitá-lo explicitamente para expandir os aliases. Isso também funcionará:
sudo bash -l -O expand_aliases -c 'll'
(O caso em que o bash era interativo não precisava de um shell login , já que isso é suficiente para ler os arquivos de inicialização, mas este precisa de -l
para leia-os.)
Estas são linhas de comando bastante longas ... E elas também exigem que você cite o comando shell inteiro, então se você está chamando um alias com argumentos, você terá que transformar tudo isso em uma string ... Então é meio desajeitado usar ...
Note que antes eu estava falando sobre aliases e funções ... Isso foi proposital, já que as funções são muito mais convenientes aqui. Você não precisa de nada especial (como ter um shell interativo ou definir uma opção específica) para executar funções em um shell, contanto que você esteja obtendo sua definição.
Portanto, se você definiu ll
como uma função em vez de um alias, poderá usá-lo diretamente com o atalho -i
do sudo:
sudo -i ll
E se você tiver uma linha de comando mais longa, com argumentos, também poderá passá-los diretamente aqui:
sudo -i ll -C -R /etc
(Compare com sudo bash -i -c 'll -C -R /etc'
.)
Funções também são muito mais flexíveis e geralmente mais fáceis de manter ... Geralmente é fácil converter um alias em uma função, a única ressalva é sempre usar "$@"
onde você espera que argumentos extras sejam obtidos ( normalmente no final do alias.)
Por exemplo, esse alias:
alias ll='ls $LS_OPTIONS -l'
Pode ser transformado nesta função:
ll () {
ls $LS_OPTIONS -l "$@"
}
Eles são, na maioria dos casos, equivalentes. E, como mencionado anteriormente, a função deve ser acessível diretamente de sudo -i
, então isso é um bônus adicional.
Espero que você ache esta resposta e explicação úteis!