No caso geral, o que você está tentando fazer não funciona realmente.
Com aliases, há praticamente apenas uma reconfiguração de string antes que a linha seja passada para execução.
Então, por exemplo, se você tiver
alias sudo='sudo '
alias foo='bar baz'
quando você digita sudo foo
, a linha de comando é reescrita em sudo bar baz
e é o que é executado. Isso é simples de reescrever a 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 qualquer qualquer coisa que o shell possa fazer. E, mais importante, eles são executados no contexto do shell atual. Quando você executa sudo myfunction
, nada disso é possível; em particular, os comandos sudo
são executados como um subprocesso e, portanto, não podem afetar o shell atual.
A solução alternativa usada para itens como sudowrap
mencionado acima é tentar trabalhar automaticamente em sudo bash -c 'myfunction() {...} ; myfunction'
. Isso chama explicitamente uma nova subcamada bash
e, em seguida, executa a função nessa subcamada. A chamada explícita deixa claro que coisas como configurar variáveis e afins 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 shell em vez de funções; então sudo
pode chamá-los diretamente. O exemplo dado no link seria mais fácil se você tivesse duk
convertido para um executável
#!/bin/bash
exec du -k "$@" | sort -n
Isso funcionará como esperado!