Bash: Quelle est l'utilité du type (Bash builtins)?

16

Je suis tombé sur une commande dans le script Bash dans laquelle j'ai trouvé:

find /var/log/abcd -type f

La commande ci-dessus était dans le contexte du nettoyage des fichiers journaux. Je sais ce que findça fait.

Après l'avoir vu -type f, j'ai cherché la page de manuel pour ça. J'ai pu le voir dans la page de manuel de BASH_BUILTINS (1)

La description de l'indicateur -f sous la typecommande est: -

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

Voici mes questions:

  1. À quoi ça sert type?
  2. Quelle est la signification du -fdrapeau?
  3. Quelle est l'utilité d'utiliser typeavec la findcommande?

[EDIT]: - Après avoir lu tous les commentaires et réponses jusqu'à maintenant, je voudrais mentionner la cause de ma mauvaise interprétation de -type option in command findVs type command. Tout cela est arrivé parce que je supposais et jusqu'à ce jour, je n'ai vu que les options courtes (tests dans le cas de la findcommande) avec un seul signe moins '-' , par exemple ls -l,. La plupart du temps, j'ai vu de longues options avec le signe moins double «-» , par exemple ls --version.

Akshay Patil
la source
1
La typecommande intégrée n'est pas utilisée par find. L' -typeoption de faire findautre chose. Voir help typeet man findobtenir vos réponses.
1
Cette mauvaise interprétation spécifique est très spécifique et ne va probablement pas aider les autres en tant que question
Anthon
9
Pourquoi downvoting? Bien que la question montre que l'OP ne sait pas grand-chose sur Unix, ce n'est pas correct de voter contre une question pour ces motifs. Akshay est même allé jusqu'à lire une page de manuel que la plupart des gens qui posent des questions ici ne font pas.
Stéphane Chazelas
veuillez reformuler le titre de votre question, car votre titre actuel empêche les personnes qui recherchent vraiment l'utilisation du «type» intégré de bash d'obtenir une réponse précise.
Sajuuk

Réponses:

21

Dans ce cas, cela typen'a rien à voir avec le bash intégré type, mais plus à ce sujet plus tard.

Un peu de "type"

La typecommande intégrée BASH vous donne des informations sur les commandes. Donc:

$ type type
type is a shell builtin

La syntaxe est:

type [-tap] [name ...]
  • -t: imprimer uniquement le type, s'il est trouvé
  • -a: affiche toutes les occurrences de la commande, intégrées et autres.
  • -p: imprime le fichier disque qui serait exécuté sur appel à la commande, ou rien.

Si nous regardons time, killet à cattitre d'exemple:

$ 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

Maintenant, cela spécifie que si vous êtes dans un shell et un type Bash time some_cmd, le code bash timeest utilisé. Pour utiliser le système, timevous pouvez le faire /usr/bin/time some_cmd.

Une façon souvent utilisée pour s'assurer que la commande système, et non intégrée, est utilisée est d'utiliser which.

tt=$(which time)

puis utilisez $ttpour appeler le système time.


La commande en question

Dans ce cas, -typec'est une option de la commande find. L'option prend un argument par lequel spécifier le type d'entité. Exemple

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

Il y a plus, vérifiez man findle reste.

Pour rechercher l'option spécifique que vous pouvez faire (en étant chez l'homme):

/ ^ \ s * -typeEnter

Ensuite, utilisez npour le prochain jusqu'à ce que vous le trouviez.


Un peu sur la commande shell

C'est un peu une interprétation personnelle.

Certaines des choses qui méritent d'être mentionnées, dans ce cas spécifique, sont les commandes, les options, les arguments et les canaux.

C'est un peu vaguement utilisé, mais dans mon vocabulaire, nous avons en bref:

  • commande: un programme ou intégré .
  • paramètre: une entité après le mot de commande.
  • option: un paramètre facultatif .
  • argument: un paramètre obligatoire.

Dans une spécification de commande, les crochets sont utilisés pour spécifier les options et, éventuellement moins / plus grands ensuite, pour spécifier les arguments. Donc:

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

Donne -a -bet en -stant que paramètres facultatifs, et filerequis. -test facultatif, mais s'il est spécifié, prend l'argument requis bar. Les points indiquent qu'il peut prendre plusieurs fichiers.

Ce n'est pas une spécification exacte, et souvent manou helpest nécessaire pour être sûr.

Le positionnement des options d'arguments et la saisie peuvent souvent être mélangés, mais il est généralement préférable de conserver une approche basée sur la position car certains systèmes ne gèrent pas le positionnement mixte des arguments. Par exemple:

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

Les deux fonctionnent sur certains systèmes, tandis que ce dernier ne fonctionne pas sur d'autres.


Dans votre commande exacte, tous les paramètres appartiennent à find- donc si vous vous interrogez sur une propriété, man findc'est le bon endroit à regarder. Dans les cas où vous devez consulter les pages de manuel du shell, etc., par exemple:

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

Le -execest un -exec some_command {} \;paramètre spécial où tous les paramètres sont attribués à find, mais la some_command {} \;partie est développée, à l'intérieur findde some_command string_of_found_entity.


Plus loin

  • citer
  • expansion
  • substitution de commande
  • et bien plus

Vous pourriez trouver cela utile .

Runium
la source
Très informatif.
Fredrick Gauss
8

Vous devez regarder dedans man find, pas dans help typeou man bash. typedans findspécifiera le type de fichier dont vous avez besoin:

   -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)

Et intégré typeest une chose complètement différente et ce n'est PAS celui qui est utilisé à l'intérieur find.

se ruer
la source
0

Vous avez regardé la mauvaise page du manuel, ce n'est pas la type -fcommande mais l' find -type foption qui est assez différente, consultez le findmanuel pour des explications appropriées.

jlliagre
la source
0

-type findique à find de n'imprimer que les fichiers de type f, c'est-à-dire les fichiers simples, pas les répertoires, pas les liens symboliques et pas les fichiers de périphérique. man findpuis recherchez l' -foption.

X Tian
la source
0

Ce n'est pas la bonne page de manuel que vous consultez. Vous devriez utiliser

man find

qui vous dira qu'avec -type fle -typeprédicat ne sélectionne que les fichiers normaux.

Zelda
la source