Quando uso o type
comando para descobrir se cat
há um shell embutido ou um programa externo, obtenho a saída abaixo:
-$ type cat
cat is hashed (/bin/cat)
-$
Isso significa que cat
é um programa externo /bin/cat
?
Fiquei confuso, porque quando chequei a saída abaixo, echo
pude ver que é um programa, built-in
mas também um programa/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Portanto, não pude usar a lógica que /bin/cat
significa necessariamente um programa externo, porque o eco era, /bin/echo
mas ainda assim , um recurso interno .
Então, como eu sei o que cat
é? Integrado ou externo?
bash
cat
echo
shell-builtin
sps
fonte
fonte
type which
poderia lhe dar a resposta porquewhich
não lhe dará a resposta.cat
els
são / foram escritos pelo próprio Stallman. Você ficaria surpreso com a quantidade de coisas que ele escreveu. Não esqueça que ele escreveu as primeiras versões do compilador que hoje é o melhor compilador do mundo que compila TUDO e a maioria dos principais utilitários. Apenas sayinRespostas:
type
informa o que o shell usaria. Por exemplo:Isso significa que, se você digitar, no prompt do bash,
echo
obterá o built-in. Se você especificar o caminho, como em/bin/echo
, receberá o comando externo.which
, por outro lado, é um programa externo que não possui conhecimento especial do que o shell fará. Em sistemas do tipo debian,which
é um script de shell que pesquisa o executável no PATH. Assim, ele fornecerá o nome do executável externo, mesmo que o shell use um built-in.Se um comando estiver disponível apenas como interno,
which
nada retornará:Agora, vamos olhar para
cat
:cat
é um executável externo, não um shell embutido.fonte
type -all echo
descobrir (em ordem) quais são os diferentes "ecos" conhecidos pelo shell (o primeiro é aquele que o shell chamará, se você não especificar algo para alterar a ordem, como invocar"echo"
ou\echo
, oucommand echo
)echo
por razões históricas. Começou como um comando externo e, em seguida, foi adicionado como incorporado. As versões anteriores do shell Bourne (/bin/sh
) não o possuíam./bin/echo
foi mantido para compatibilidade, uma vez que todos os tipos de coisas dependiam disso. (A mesma coisa aconteceu comtest
.)which
em si pode ser um shell built-in cmd, por exemplo, tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
é comocat is /bin/cat
(isto é, é um programa externo ).A diferença é que você já correu
cat
nesta sessão; portanto, o bash já procurou$PATH
e armazenou o local resultante em uma tabela de hash, para que não precise procurá-lo novamente nesta sessão.Para ver todos os comandos que foram hash na sua sessão, execute
hash
fonte
Outra maneira de verificar a lista de shell embutidos: Usando o
compgen
que é o shell embutido em si!O comando a seguir lista todos os comandos internos do shell:
Você pode procurar por
cat
,echo
greping como: -Você pode ver
compgen -b | grep cat
retornos sem saída, significa quecat
não está embutido no shell .Visite uma lista de opções úteis fornecidas por
compgen
.Você também pode usar um outro comando embutido:
help
para exibir o shell embutido.fonte
compgen
?man bash | grep -e '-A action$' -A 32
você provavelmente obtém uma saída como esta . (aumentar / diminuir o dígito depois-A
de gerenciar adequadamente).Você também pode usar o comando
whereis
que é mais eficiente, pois mostra onde o comando está na máquina, como também a biblioteca de páginas de manual, etc.fonte
Outros já responderam
cat
, gostaria apenas de explicar o problemaecho
. Se você usar o tipo de-a
opção (lista todos os jogos), você vai ver queecho
é tanto um builtin shell e um programa externo:Os dois são completamente independentes um do outro.
type
sem opções retornará simplesmente o primeiro comando correspondente encontrado. Portanto, o tipofoo
mostrará o que será executado se você executarfoo
. Pode haver outras opções, mas essas não serão mostradas a menos que você use-a
.fonte
Como existem várias boas respostas aqui sobre o uso do tipo para descobrir se um comando como
cat
um programa interno ou externo. Vou adotar uma abordagem mais geral. Existem alguns comandos que devem ser incorporados porque afetam o shell atual. Três exemplos clássicos sãocd
,exec
eexit
. Existem alguns comandos que não devem ser integrados porque sua funcionalidade depende do comportamento da execução ou das chamadas do sistema. Exemplos de tais programas incluemsu
,sudo
,calife
esuper
. Todos os outros comandos podem ser criados como programas internos ou externos.cat
é um ótimo exemplo de programa dessa classe, pois existem shells que o incluem como interno e shells que não. Vale notar que muitos comandos dessa classe que estão disponíveis como internos também estão disponíveis como programas externos.fonte