Vale lembrar também que, apesar do status de cd
como um shell embutido ou binário externo, o sudo funciona gerando um novo processo para executar o comando especificado .
Por que isso é importante? Porque o fluxo básico de execução do sudo se torna algo muito parecido com isso:
- O shell gera um subprocesso para executar o sudo com os parâmetros fornecidos
- o sudo autentica o usuário e confirma seu direito de executar o comando especificado
- o sudo gera um subprocesso para executar o comando especificado
- o sudo aguarda o subprocesso gerado na etapa 3 para sair
- o sudo sai, retornando ao shell
- O subprocesso gerado na etapa 1 é encerrado, retornando o usuário para o prompt de shell
(Este pode ser tecnicamente ligeiramente incorreto; há uma chamada de sistema que realmente substitui o processo em execução por um novo (que é o ( execve()
) da biblioteca C. No entanto, para os propósitos desta explicação, os dois são equivalentes.)
Isso se torna importante quando você considera que o diretório de trabalho atual é uma propriedade de cada processo e é herdado, mas não promovido . Portanto, se o processo A gerar um novo processo B, então o processo B começa com o mesmo diretório de trabalho em que o processo A estava. (É por isso que algo tão mundano quanto ls ./
faz o que você espera.) seu diretório de trabalho, a menos que o processo A fique fora do caminho procurando por isso, A está completamente inconsciente dessa mudança. (Isso, por sua vez, é o porquê se você executar algo como find /
e abortar até a metade, você não terminará em algum local aparentemente aleatório no sistema de arquivos apenas porque achei que estava olhando para lá no momento foi abortado.)
Portanto, mesmo que sudo cd /somewhere
tenha feito exatamente o que diz na lata, quando sudo
sair, você será levado de volta ao ponto de partida. Portanto, efetivamente, do ponto de vista do usuário, ele se torna um não operacional. O fato de que cd
, enquanto estava em execução, chamou a função de biblioteca do sistema chdir()
para definir um novo diretório de trabalho, não ajuda você, o usuário.
Como Warren Hill apontou, a solução correta (eu realmente não chamaria uma solução alternativa) é usar sudo -i
, que o leva a um shell de root, onde você pode navegar livremente pelo sistema de arquivos e executar os comandos que quiser. Observe, no entanto, que quando você sair desse shell, você ainda é trazido de volta para onde começou na hierarquia de diretórios exatamente pelo mesmo motivo descrito acima.