O 'cat' é um shell embutido ou um programa externo?

31

Quando eu uso o comando type para descobrir se cat é um shell embutido ou um programa externo, recebo a saída abaixo:

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

Isso significa que cat é um programa externo que é /bin/cat ?

Eu fiquei confuso, porque quando eu chequei a saída abaixo para echo eu consegui ver que é um built-in mas também um programa /bin/echo

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

Por isso, não consegui usar a lógica de que /bin/cat significa necessariamente um programa externo, porque o echo era /bin/echo , mas ainda era interno.

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

    
por sps 10.06.2015 / 05:21

6 respostas

58

type informa 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, no prompt bash, você digitar echo , receberá o built-in. Se você especificar o caminho, como em /bin/echo , você receberá o comando externo.

which , pelo contrário, é um programa externo que não tem nenhum conhecimento especial do que o shell fará. Em sistemas parecidos com o debian, which é um script de shell que procura o PATH pelo executável. Assim, ele lhe dará o nome do executável externo, mesmo se o shell usasse um built-in.

Se um comando só estiver disponível como um built-in, which não retornará nada:

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

Agora, vamos ver cat :

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

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

    
por 10.06.2015 / 05:33
44

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

A diferença é que você já executou cat nesta sessão, então o bash já pesquisou em $PATH e armazenou o local resultante em uma tabela de hash para que não precise procurar novamente neste sessão.

Para ver todos os comandos que foram divididos em 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
    
por 10.06.2015 / 07:47
4

Outra maneira de verificar a lista de shell embutido: Usando compgen que é o próprio shell embutido!

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

compgen -b

Você pode verificar por cat , echo por greping como: -

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

Você pode ver compgen -b | grep cat retorna sem saída, significa que cat não é integrado ao shell .

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

Você também pode usar um outro comando interno: help para exibir o shell integrado.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
    
por 10.06.2015 / 07:10
4

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

    
por 10.06.2015 / 05:48
2

Outros já responderam sobre cat , gostaria apenas de explicar o problema com echo . Se você usar a opção -a do tipo (listar todas as correspondências), verá que echo é ambos um shell embutido 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. type sem opções simplesmente retornará o primeiro comando correspondente encontrado. Então, digite foo para mostrar o que será executado se você executar foo . Pode haver outras opções, mas elas não serão exibidas, a menos que você use -a .

    
por 11.06.2015 / 15:45
2

Como existem várias boas respostas aqui sobre como usar o tipo para descobrir se um comando como cat é um programa interno ou externo. Eu vou ter uma abordagem mais geral. Existem alguns comandos que devem ser construídos porque afetam o shell atual. Três exemplos clássicos são cd , exec e exit . Existem alguns comandos que não devem ser construídos porque sua funcionalidade depende do comportamento das chamadas execve ou do sistema. Exemplos de tais programas incluem su , sudo , calife e super . Todos os outros comandos podem ser construídos como builtins ou programas externos. cat é um ótimo exemplo de programa desta classe, pois existem shells que o incluem como um builtin e shells que não o fazem. Vale a pena notar que muitos comandos desta classe que estão disponíveis como builtins também estão disponíveis como programas externos.

    
por 11.06.2015 / 20:30