Eu encontrei um comando Linux builtin cd
,.
Qual é a diferença entre os comandos builtin cd
e cd
?
De fato, fiz algumas pesquisas sobre a diferença, mas não consegui encontrar uma explicação notável e significativa sobre isso.
Eu encontrei um comando Linux builtin cd
,.
Qual é a diferença entre os comandos builtin cd
e cd
?
De fato, fiz algumas pesquisas sobre a diferença, mas não consegui encontrar uma explicação notável e significativa sobre isso.
Respostas:
O cd
comando é um built-in, então normalmente builtin cd
fará o mesmo que cd
. Mas há uma diferença se cd
for redefinido como uma função ou um alias; nesse caso cd
, chamará a função / alias, mas builtin cd
ainda mudará o diretório (em outras palavras, manterá o built-in acessível, mesmo se for derrotado por uma função).
Por exemplo:
user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd # undefine function
Ou com um alias:
user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd # undefine alias
Usar builtin
também é uma boa maneira de definir uma cd
função que faz algo e altera o diretório (uma vez que a chamada a cd
partir dele continuaria chamando a função novamente em uma recursão sem fim).
Por exemplo:
user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd # undefine function
builtin cd mysubdir
e \cd mysubdir
?
cd
, caso em \cd
que ignoraria o alias e executaria a função. Veja stackoverflow.com/a/16506263/4518341
Na maioria dos casos, não há diferença (mas veja abaixo). O cd
comando é um comando interno em todos os shells. Ele precisa ser incorporado 1, pois um comando externo não pode alterar o ambiente do shell de chamada e a alteração do diretório de trabalho constitui uma alteração em seu ambiente.
O bash
comando builtin
força o shell a usar a versão interna de um comando, mesmo que possa haver uma função de shell, alias ou comando externo disponível com o mesmo nome.
No caso em que não é , por exemplo, uma função de shell com o nome cd
, então builtin cd
seria não chamar isso. O uso de builtin cd
ignora qualquer funcionalidade sobrecarregada que possa ter sido adicionada por meio de uma função de shell ou alias pelo usuário.
Exemplo:
O cd
comando interno pode estar sobrecarregado por uma função que atualiza o prompt:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
Onde __update_prompt
está outra função fornecida pelo usuário que gera uma string.
A builtin cd
função in não chamaria a função recursivamente. O uso builtin cd
em um shell em que essa função está ativa também não chamaria a função.
1 Existem Unices com um cd
comando externo (macOS e, acredito, Solaris). O objetivo desse comando, que não pode alterar o diretório de trabalho de um shell, é possivelmente satisfazer o padrão POSIX, que é listado cd
como um dos utilitários externos que devem estar disponíveis ( cd
não é um dos "utilitários embutidos especiais") . Também pode servir como um teste para verificar se seria possível alterar o diretório de trabalho para um determinado diretório .
cd
comando externo .