O que o comando interno faz no bash?

35

Eu sei o que é um comando interno, mas o que builtinele faz? A execução which lsme mostra /bin/ls, mas a execução which builtinnão retorna nada.

man builtinapenas me fornece uma lista de comandos internos, um dos quais é builtin. O restante da página de manual explica o que é um builtin, mas não o que builtiné.

builtin --helpme diz, builtin: usage: builtin [shell-builtin [arg ...]]mas ainda não é o que faz.

É parte do bash de uma maneira que outros comandos internos não são?

lfalin
fonte
3
Você esqueceu help builtin.
Ignacio Vazquez-Abrams
3
which builtinnão retorna resultados, porque whichrelata a localização dos comandos externos . Se você perguntar ao shell type builtin, ele lhe dirá, sem surpresa, isso builtin is a shell builtin. Você vai encontrar o mesmo com alias, setetc.
Toby Speight
1
builtin help builtin
theonlygusti

Respostas:

50

O builtincomando garante que você execute a versão interna do comando em vez de executar outro comando com o mesmo nome.

Por exemplo, digamos que você definiu uma função shell chamada cdpara imprimir algum status extra toda vez que você altera os diretórios. Mas você estragou tudo e agora não pode alterar os diretórios corretamente. Portanto, agora você pode digitar builtin cd ~com êxito o cd de volta para o diretório inicial sem executar a função de shell quebrada.

E, a propósito, minha cópia da página de manual do bash tem uma seção chamada "SHELL BUILTIN COMMANDS" e define o significado do builtincomando nessa seção (transcrita abaixo).

builtin shell-builtin [argumentos]

    Execute o shell especificado incorporado, passando argumentos e
    retornar seu status de saída. Isso é útil ao definir uma função
    cujo nome é o mesmo que um shell embutido, mantendo o
    funcionalidade do builtin dentro da função. O CD embutido é
    comumente redefinido dessa maneira.

    O status de retorno é falso se o shell-builtin não for um shell embutido
    comando.
Spiff
fonte
14
boa resposta. Mas me faz pensar, como você pode ter certeza de que o builtincomando é realmente o bash do bash?
Pacopaco 17/08/19
14
@ Pacopaco: Você não pode :-). Você pode substituir builtin, também: function builtin { echo "Hi from builtin :-)"; }. Então builtinnão funciona mais.
sleske
12
@ Pacopaco, type builtindirá se é real builtin. A menos que typetenha sido substituído por um type...
Toby Speight
10
oh ... infelizmente, é possível: alias unset = "echo unset é substituído"; alias alias = "eco alias é substituído" ... Portanto, não há sorte aqui.
Olivier Dulac
8
Eu amo essa discussão em andamento!
Sam Weaver