Estou executando o Ubuntu 10.04 e uso upstart
para gerenciamento de daemon. Meu aplicativo corporativo é executado como um daemon e deve ser executado como root devido a vários privilégios. Por exemplo:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Gostaria de apresentar um alias
para abreviar esses comandos como algo como:
alias startapp='sudo start my-application-long-ID'
e executá-lo como startapp
e que funciona, mas eu preferiria não ter sudo no alias.
alias startapp='start my-application-long-ID'
não ao executar usando sudo startapp
, retornando sudo: startapp: command not found
.
No entanto, quando adicionei o alias:
alias sudo='sudo '
sudo startapp
agora funciona, mas ainda estou curioso por que o sudo ignora aliases.
source ~/.bashrc
? Isso atualiza o arquivo .bashrc e disponibiliza os novos aliases?Respostas:
Eu vejo as informações abaixo daqui .
Ao usar o sudo, use expansão de alias (caso contrário, o sudo ignora seus aliases)
A razão pela qual não funciona é explicada aqui .
fonte
Aliases e funções são definidos em um shell. Sudo é um programa externo. Portanto, o sudo não vê aliases, funções ou embutidos no shell, apenas comandos externos.
Os aliases devem ser nomes de comandos alternativos; portanto, os shells os expandem apenas na posição de comando, não quando são argumentos para comandos. O Zsh suporta aliases globais, que são expandidos em qualquer lugar na linha de comando, e é melhor usar com moderação, pois existe o risco de expandi-los acidentalmente, mesmo em contextos em que o alias não faz sentido.
Você pode dizer sudo para invocar um shell:
sudo sh -c '…shell command here…'
. Seus aliases habituais não estarão disponíveis dentro desse comando shell, no entanto, uma vez que normalmente são armazenados em um arquivo como~/.bashrc
ou~/.zshrc
que é lido apenas por shells interativos.alias sudo='sudo '
, como proposto por Ramesh , faz com que o shell expanda os aliases depoissudo
.fonte
alias sudo='sudo '
trabalho para ZSH também?Uma solução para usuários zsh
No bash e no zsh, encerrar um alias com um espaço fará com que o shell alias expanda a próxima palavra. Isso permite que algo como o seguinte alias expanda
myalias
Infelizmente, isso se desfaz quando você tem mais de uma palavra no seu alias (como
sudo -u someone
. No entanto, você pode abusar do recurso "aliases globais" do zsh para expandir manualmente os aliases em qualquer lugar do comando.Isso cria um alias global chamado
$
(você pode usar qualquer palavra que desejar) que termina em um espaço. Isso faz com que o zsh expanda a próxima palavra como um alias de comando regular. Como o alias se expande para espaços em branco, não será tratado como argumento. Isso permite que o seguinte funcione.Você pode até usar
$
várias vezes em uma linha de comando se tiver um aninhamento de comando complicado. Eu achei isso útil o suficiente para que ele tenha um lugar permanente no meu zshrc, no entanto, o alias é simples o suficiente para definir quando você precisa usá-lo.fonte
Eu apenas dei uma resposta alternativa aqui sem redefinir
sudo
com um alias.No seu caso, seria:
Tudo em uma linha, sem conchas extras, sem redefinições de alias. ;-)
fonte
xargs
para retirar as aspas e grep para retirar a liderança=
. Meio inteligente, mas provavelmente desnecessário.eval "sudo $(alias aliasname | cut -d= -f2-)"
provavelmente é melhor -xargs
nem sempre manipulará as aspas corretamente e poderá haver mais de uma=
.xargs
não retira as aspas. É grep quem recebe o comando resolvido entre as aspas. Você sabe quetype -a alias_name
retorna algo comoalias_name is aliased to command_within_quotes
. Pelo jeito que eu tentei o seu comando e não funcionou no meu ubuntu :-( É o retorno de.type -a
Diferente entre as versões Linux (eu duvido)?.type
faz - dentrobash
. Você entende, porém, que as aspas são duplicadas, certo? Você já tentou com um alias que continha aspas simples? Enfim, você está certo sobre o meu negócio não funcionar - você precisaeval "sudo sh -c "$(...
oueval "'sudo $(alias alias_name| cut -d\' -f2-)"
. O problema é que elesalias
são basicamente pré-arranjadoseval
- oalias
utilitário deve exibir seu conteúdo para que possa ser reinicializado com segurança no shell. Eu acho que o seuxargs
é implementado, em seguida, para achatar o espaço em branco? Apenas tenha cuidado com isso, ok?