'Cat' é um shell embutido ou um programa externo?


33

Quando uso o typecomando para descobrir se cathá 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, echopude ver que é um programa, built-inmas 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/catsignifica necessariamente um programa externo, porque o eco era, /bin/echomas ainda assim , um recurso interno .

Então, como eu sei o que caté? Integrado ou externo?


1
-O comando cat é um programa externo que faz parte do sistema, pois muitas ações que ele pode executar não são um simples embutido.
Joke Sr. OK

12
type whichpoderia lhe dar a resposta porque whichnão lhe dará a resposta.
Dubu

1
Depende do shell que você está usando
NSN

6
Curiosidade: ambos cate lssã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 sayin
Alec Teal

2
@AlecTeal Você percebe que a maioria dos sistemas Unix usa versões de ls e cat que são anteriores às versões GNU nas quais Richard Stallman teve uma mão?
Ross cume

Respostas:


59

typeinforma o que o shell usaria. Por exemplo:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

Isso significa que, se você digitar, no prompt do bash, echoobterá 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, whichnada retornará:

$ type help
help is a shell builtin
$ which help
$ 

Agora, vamos olhar para cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat é um executável externo, não um shell embutido.


5
Você pode type -all echodescobrir (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, ou command echo)
Olivier Dulac

Boa resposta. Uma adição: existem duas versões echopor 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/echofoi mantido para compatibilidade, uma vez que todos os tipos de coisas dependiam disso. (A mesma coisa aconteceu com test.)
alexis

Nota lateral: whichem si pode ser um shell built-in cmd, por exemplo, tcsh:which which which: shell built-in command.
Dan Cornilescu

Estou chegando atrasado à festa, mas por que você não verifica sua página de manual e pode realmente ver o número entre parênteses, o que indica se é um shell
interno

46

cat is hashed (/bin/cat)é como cat is /bin/cat(isto é, é um programa externo ).

A diferença é que você já correu cat nesta sessão; portanto, o bash já procurou $PATHe 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

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
Na verdade, na minha opinião, esta é a única resposta que os endereços sua pergunta :)
André Chalella

IMHO isso ^^^ é verdade. Esta resposta deve ser a aceita.
LinuxSecurityFreak

4

Outra maneira de verificar a lista de shell embutidos: Usando o compgenque é o shell embutido em si!

O comando a seguir lista todos os comandos internos do shell:

compgen -b

Você pode procurar por cat, echogreping como: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Você pode ver compgen -b | grep catretornos sem saída, significa que catnão está embutido no shell .

Visite uma lista de opções úteis fornecidas por compgen.


Você também pode usar um outro comando embutido: helppara exibir o shell embutido.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

Não consigo encontrar nenhuma documentação formal para essas opções, você sabe onde ela existe?
Random832

@ Random832 você está falando sobre opções compgen?
Pandya

sim, não consegui encontrar nada na página de manual do Bash sobre o que significa -b ou metade das outras opções. Achei mais tarde em gnu.org/software/bash/manual/html_node/...
Random832

@ Random832 tente man bash | grep -e '-A action$' -A 32você provavelmente obtém uma saída como esta . (aumentar / diminuir o dígito depois -Ade gerenciar adequadamente).
Pandya

4

Você também pode usar o comando whereisque é mais eficiente, pois mostra onde o comando está na máquina, como também a biblioteca de páginas de manual, etc.


-Excuse me pelo meu mau Inglês, porque eu apenas aprender ainda e não tão bons usando ...!
Joke Sr. OK

2

Outros já responderam cat, gostaria apenas de explicar o problema echo. Se você usar o tipo de -aopção (lista todos os jogos), você vai ver que echoé tanto um builtin shell e um programa externo:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Os dois são completamente independentes um do outro. typesem opções retornará simplesmente o primeiro comando correspondente encontrado. Portanto, o tipo foomostrará o que será executado se você executar foo. Pode haver outras opções, mas essas não serão mostradas a menos que você use -a.


2

Como existem várias boas respostas aqui sobre o uso do tipo para descobrir se um comando como catum 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ão cd, exece exit. 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 incluem su, sudo, califee super. 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.