Eu instalei um utilitário em um servidor recentemente e descobri que ele não estava disponível ao executar a partir de sudo
. Ou seja, foo
executado conforme o esperado. Comprar sudo foo
resultou em sudo: foo: command not found
.
Eu rastreei isso de volta para o comando sendo vinculado de /usr/local/bin
e sudo usando um PATH
que tinha apenas /usr/bin
. Eu modifiquei o script de instalação para instalar o /usr/bin
e tudo ficou feliz.
Eu gostaria de alterar o script de configuração do meu servidor para detectar este caso e informar um erro se algo mudar e o comando não estiver disponível por algum motivo no futuro. Estou trabalhando com essa pergunta do StackOverflow e sua respostas que sugerem usar um teste como este:
command -v foo >/dev/null 2>&1 || { echo "I require foo but it's not installed. Aborting." >&2; exit 1; }
No entanto, isso não se comporta como esperado para sudo
.
$ command -v foo
/usr/bin/foo
$ sudo command -v foo
sudo: command: command not found
$ sudo type foo
sudo: type: command not found
$ sudo hash -v foo
sudo: hash: command not found
$ sudo foo
...executes normally...
$ sudo bash
# command -v foo
/usr/bin/foo
# sudo command -v foo
sudo: command: command not found
# foo
...executes normally...
# sudo foo
...executes normally...
Curiosamente sudo which foo
encontra o comando em /usr/bin/
; quando executo sudo which bar
, ele me diz which: no foo in (/sbin:/bin:/usr/sbin:/usr/bin)
, indicando que o caminho para o sudo contém /usr/bin
ao ativar subcomandos.
O que está acontecendo?
Que teste posso executar para determinar se um comando está disponível para ser chamado com sudo
sem invocar o comando? (Além disso, sem invocar which
, como vários comentários e respostas na questão vinculada avisar, senão eu ficaria bem com isso ...)