O cdcomando é um built-in, então normalmente builtin cdfará a mesma coisa que cd. Mas há uma diferença se cdfor redefinido como uma função ou alias, nesse caso cdchamará a função/alias, mas builtin cdainda alterará o diretório (em outras palavras, manterá o built-in acessível mesmo se sobrecarregado 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 builtintambém é uma boa maneira de definir uma cdfunção que faz algo e altera o diretório (já que chamar cda partir dela 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
Na maioria dos casos, não há diferença (mas veja abaixo). O cdcomando é um comando embutido em todos os shells. Ele precisa ser embutido 1 , pois um comando externo não pode alterar o ambiente do shell de invocação, e alterar o diretório de trabalho constitui uma mudança em seu ambiente.
O bashcomando builtinforça o shell a usar a versão interna de um comando, mesmo que possa haver uma função shell, alias ou comando externo disponível com o mesmo nome.
No caso de haver , por exemplo, uma função shell com o nome cd, então nãobuiltin cd chamaria isso. O uso ignora qualquer funcionalidade sobrecarregada que possa ter sido adicionada por meio de uma função de shell ou alias pelo usuário.builtin cd
Exemplo:
O cdcomando interno pode estar sobrecarregado por uma função que atualiza o prompt:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
onde __update_prompté alguma outra função fornecida pelo usuário que gera uma string.
O builtin cdna função não chamaria a função recursivamente. Usar builtin cdem um shell onde esta função está ativa, além disso, não chamaria a função.
1 Existem Unices com cdcomando 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 lista cdcomo um dos utilitários externos que devem estar disponíveis ( cdnão é um dos "utilitários internos especiais") . Também pode servir como um teste para ver se seria possível mudar o diretório de trabalho para um determinado diretório .
O
cd
comando é um built-in, então normalmentebuiltin cd
fará a mesma coisa quecd
. Mas há uma diferença secd
for redefinido como uma função ou alias, nesse casocd
chamará a função/alias, masbuiltin cd
ainda alterará o diretório (em outras palavras, manterá o built-in acessível mesmo se sobrecarregado por uma função.)Por exemplo:
Ou com um alias:
Usar
builtin
também é uma boa maneira de definir umacd
função que faz algo e altera o diretório (já que chamarcd
a partir dela continuaria chamando a função novamente em uma recursão sem fim).Por exemplo:
Na maioria dos casos, não há diferença (mas veja abaixo). O
cd
comando é um comando embutido em todos os shells. Ele precisa ser embutido 1 , pois um comando externo não pode alterar o ambiente do shell de invocação, e alterar o diretório de trabalho constitui uma mudança em seu ambiente.O
bash
comandobuiltin
força o shell a usar a versão interna de um comando, mesmo que possa haver uma função shell, alias ou comando externo disponível com o mesmo nome.No caso de haver , por exemplo, uma função shell com o nome
cd
, então nãobuiltin cd
chamaria isso. O uso ignora qualquer funcionalidade sobrecarregada que possa ter sido adicionada por meio de uma função de shell ou alias pelo usuário.builtin cd
Exemplo:
O
cd
comando interno pode estar sobrecarregado por uma função que atualiza o prompt:onde
__update_prompt
é alguma outra função fornecida pelo usuário que gera uma string.O
builtin cd
na função não chamaria a função recursivamente. Usarbuiltin cd
em um shell onde esta função está ativa, além disso, não chamaria a função.1 Existem Unices com
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 listacd
como um dos utilitários externos que devem estar disponíveis (cd
não é um dos "utilitários internos especiais") . Também pode servir como um teste para ver se seria possível mudar o diretório de trabalho para um determinado diretório .