Recentemente, aprendi que você pode ativar sudo
aliases personalizados da seguinte maneira:
alias sudo='sudo ' # note: the space is required!
A razão pela qual isso funcionaé o seguinte:
Se o último caractere do valor do alias for um espaço ou tabulação, a próxima palavra de comando após o alias também será verificada quanto à expansão do alias.
Minha pergunta é: existe alguma maneira de habilitar sudo
funções personalizadas também?
Responder1
No caso geral, o que você está tentando fazer realmente não funciona.
Com aliases, há praticamente apenas uma reescrita da string antes que a linha seja passada para execução.
Então, por exemplo, se você tiver
alias sudo='sudo '
alias foo='bar baz'
então quando você entra sudo foo
na linha de comando é reescrito sudo bar baz
equeé então o que é executado. Esta é uma simples reescrita de linha de comando.
Agora as funções são mais difíceis. Não são simples reescritas, mas uma avaliação completa; eles podem definir variáveis, alterar diretórios, abrir arquivos... praticamente fazemqualquer coisao shell pode fazer. E, o mais importante, eles são executados no contexto do shell atual. Quando você corre sudo myfunction
, nada disso é possível; em particular, sudo
os comandos são executados como um subprocesso e, portanto, não podem afetar o shell atual.
A solução alternativa usada para coisas como as sudowrap
mencionadas acima é tentar resolver automaticamente sudo bash -c 'myfunction() {...} ; myfunction'
. Isso chama explicitamente um novo bash
subshell e, em seguida, executa a função nesse subshell. A chamada explícita deixa claro que coisas como definir variáveis e coisas do gênero não funcionarão :-) Ela permite um subconjunto limitado de funcionalidades.
O tipo de funções que você pode chamar dessa maneira pode ser melhor reescrito como scripts de shell em vez de funções; então sudo
pode ligar para eles diretamente. O exemplo dado emhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlseria mais fácil convertendo duk
para um executável
#!/bin/bash
exec du -k "$@" | sort -n
Isso funcionará conforme o esperado!