Bash: para que serve o tipo (Bash builtins)?

16

Me deparei com um comando no script Bash no qual encontrei:

find /var/log/abcd -type f

O comando acima estava no contexto de limpeza dos arquivos de log. Eu sei o que findfaz.

Depois de ter visto -type f, procurei na página de manual. Eu pude vê-lo na página de manual de BASH_BUILTINS (1)

A descrição do sinalizador -f sob typecomando é: -

The -f option suppresses shell function lookup, as with the command builtin.

A seguir, minhas perguntas:

  1. Para que serve type?
  2. Qual é o significado da -fbandeira?
  3. Qual é a utilidade de usar typecom o findcomando?

[EDIT]: - Depois de ter lido todos os comentários e respostas até agora, gostaria de mencionar o motivo de minha má interpretação do -type option in command findVs type command. Tudo isso aconteceu porque eu estava assumindo e até a data vi apenas as opções curtas (testes no caso do findcomando) com um único sinal de menos '-' , por exemplo ls -l. Na maioria das vezes, tenho visto opções longas com o sinal de menos duplo '-' , por exemplo ls --version.

Akshay Patil
fonte
1
O typecomando interno não é usado por find. A -typeopção de findfazer outra coisa. Veja help typee man findobtenha suas respostas.
1
Esta má interpretação específica é muito específico e pouco provável indo para ajudar os outros como uma questão
Anthon
9
Por que voto negativo? Embora a pergunta mostre que o OP não sabe muito sobre o Unix, não é correto rebater uma questão com base nisso. Akshay chegou a ler uma página de manual que a maioria das pessoas que faz perguntas aqui não faz.
Stéphane Chazelas
por favor considere Reformule a sua pergunta título, porque o seu título atual está impedindo que as pessoas que realmente está olhando para o uso do bash built-in 'tipo' de obter resposta precisa ..
Sajuuk

Respostas:

21

Nesse caso type, não tem nada a ver com o bash embutido type, mas mais sobre isso mais tarde.

Um pouco sobre "tipo"

O typecomando interno do BASH fornece informações sobre comandos. Portanto:

$ type type
type is a shell builtin

A sintaxe é:

type [-tap] [name ...]
  • -t: imprime apenas o tipo, se encontrado
  • -a: imprime todas as ocorrências do comando, internas e outras.
  • -p: imprime o arquivo do disco que seria executado na chamada ao comando ou nada.

Se olharmos time, kille catcomo um exemplo:

$ type time kill cat
time is a shell keyword
kill is a shell builtin
cat is /bin/cat

$ type -t time kill cat
keyword
builtin
file

$ type -a time kill cat
time is a shell keyword
time is /usr/bin/time
kill is a shell builtin
kill is /bin/kill
cat is /bin/cat

$ type -ta time kill cat
keyword
file
builtin
file
file

Agora, isso especifica que, se você estiver em um shell e tipo Bash time some_cmd, o bash builtin timeserá usado. Para usar o sistema, timevocê pode fazer /usr/bin/time some_cmd.

Uma maneira frequentemente usada para garantir que o comando do sistema, e não interno, seja usado é usando which.

tt=$(which time)

e use $ttpara chamar o sistema time.


O comando em questão

Nesse caso, -typeé uma opção para o comando find. A opção utiliza um argumento pelo qual especificar o tipo de entidade. Exemplo

find . -type f  # File
find . -type d  # Directory

Há mais, verifique man findo resto.

Para procurar a opção específica que você pode fazer (enquanto no homem):

/ ^ \ s * -typeEnter

Em seguida, use npara o próximo até encontrá-lo.


Um pouco sobre o comando shell

Isso é um pouco de interpretação pessoal.

Algumas das coisas que vale a pena mencionar, neste caso específico, são comandos, opções, argumentos e canais.

Isso é pouco utilizado, mas no meu vocabulário temos resumidamente:

  • comando: um programa ou embutido .
  • parâmetro: uma entidade após a palavra de comando.
  • opção: um parâmetro opcional .
  • argumento: um parâmetro necessário.

Em uma especificação de comando, colchetes são usados ​​para especificar opções e, opcionalmente menor / maior, usados ​​para especificar argumentos. Portanto:

foo [-abs] [-t <bar>] <file> ...
foo [-abs] [-t bar] file ...

Fornece -a -be -scomo parâmetros opcionais, e fileum obrigatório. -té opcional, mas se especificado recebe o argumento necessário bar. Pontos representam que pode levar vários arquivos.

Essa não é uma especificação exata e, com frequência manou helpé necessária para garantir.

Opções de posicionamento de argumentos e entrada muitas vezes podem ser confusas, mas geralmente é melhor manter uma abordagem baseada em posição, pois alguns sistemas não lidam com posicionamento misto de argumentos. Como um exemplo:

chmod -R nick 722 foo
chmod nick 722 foo -R

Ambos trabalham em alguns sistemas, enquanto o último não em outros.


No seu comando exato, todos os parâmetros pertencem find- portanto, se você se perguntar sobre uma propriedade, man findé o local correto para procurar. Nos casos em que você precisa consultar as páginas de manual do shell, etc., por exemplo:

find . $(some command)
find . `some command`
find . $some_var
find . -type f -exec some_command {} \;
find . -type f | some_command
...

O -execé um especial onde -exec some_command {} \;são fornecidos todos os parâmetros find, mas a some_command {} \;peça é expandida, dentro findde some_command string_of_found_entity.


Mais para frente

  • citando
  • expansão
  • substituição de comando
  • e muito mais

Você pode achar isso útil .

Runium
fonte
Muito informativo.
Fredrick Gauss
8

Você deve olhar man find, não dentro help typeou man bash. typein findespecificará o tipo de arquivo que você precisa:

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

E o builtin typeé uma coisa completamente diferente e NÃO é o que é usado por dentro find.

pressa
fonte
0

Você olhou para a página do manual errada, este não é o type -fcomando, mas a find -type fopção que é bastante diferente, consulte o findmanual para obter explicações adequadas.

jlliagre
fonte
0

-type fdiz ao find para imprimir apenas arquivos do tipo f, como arquivos simples, não diretórios, links simbólicos e arquivos de dispositivos. man finddepois procure a -fopção.

X Tian
fonte
0

Esta não é a página de manual correta que você está vendo. Você deveria estar usando

man find

isso lhe dirá que, com -type fo -typepredicado, seleciona apenas os arquivos regulares.

Zelda
fonte