Bash: Qual è l'uso del tipo (builtin di Bash)?


16

Mi sono imbattuto in un comando nello script Bash in cui ho trovato:

find /var/log/abcd -type f

Il comando sopra era nel contesto della pulizia dei file di registro. io so cosafind fa.

Dopo aver visto -type f, ho cercato la pagina di manuale per questo. L'ho visto nella pagina man di BASH_BUILTINS (1)

La descrizione di -f flag sotto typecomando è: -

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

Di seguito sono le mie domande:

  1. A cosa serve type ?
  2. Qual è il significato di -f bandiera?
  3. A che cosa serve usare typecon il findcomando?

[EDIT]: - Dopo aver letto tutti i commenti e le risposte fino ad ora, vorrei menzionare la causa per la mia errata interpretazione dei -type option in command findVs type command. Tutto questo è accaduto perché stavo assumendo e fino ad oggi ho visto solo le opzioni brevi (Test in caso di findcomando) con un solo segno meno '-' , esempio ls -l. La maggior parte delle volte ho visto lunghe opzioni con doppio segno meno "-" , ad esempio ls --version.


1
Il typecomando incorporato non è utilizzato da find. L' -typeopzione per findfare qualcos'altro. Vedi help typee man findper ottenere le tue risposte.

1
Questa specifica interpretazione errata è molto specifica e difficilmente aiuterà gli altri come una domanda
Anthon,

9
Perché effettuare il downvoting? Mentre la domanda mostra che l'OP non sa molto di Unix, non è giusto sottovalutare una domanda per questi motivi. Akshay è persino arrivato a leggere una pagina man che la maggior parte delle persone che fa domande qui non lo fanno.
Stéphane Chazelas,

ti preghiamo di considerare di riformulare il titolo della tua domanda, perché il tuo titolo attuale impedisce alle persone che stanno davvero cercando l'uso del 'tipo' incorporato di bash di ottenere una risposta accurata ..
Sajuuk

Risposte:


21

In questo caso typenon ha nulla a che fare con il bash incorporatotype , ma ne parleremo più avanti.

Un po 'di "tipo"

Il typecomando integrato BASH fornisce informazioni sui comandi. Così:

$ type type
type is a shell builtin

La sintassi è:

type [-tap] [name ...]
  • -t: stampa solo il tipo, se trovato
  • -a: stampa tutte le occorrenze del comando, sia incorporato che altro.
  • -p: stampa il file del disco che verrebbe eseguito su chiamata al comando o niente.

Se guardiamo time, kille catcome esempio:

$ 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

Ora, questo specifica che se ci si trova in una shell Bash e si digita time some_cmd, timeviene utilizzato l'integrato bash . Per usare il sistema timepuoi farlo/usr/bin/time some_cmd .

Un modo spesso usato per assicurare che il sistema, e non il comando incorporato, sia usato è usando which.

tt=$(which time)

e quindi utilizzare $ttper chiamare il sistema time.


Il comando in questione

In questo caso -typeè un'opzione per il comando find. L'opzione accetta un argomento in base al quale specificare il tipo di entità. Esempio

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

Ce ne sono altri, controlla man findil resto.

Per cercare l'opzione specifica che puoi fare (mentre sei nell'uomo):

/ ^ \ S tipo *Enter

Quindi utilizzare nper il prossimo fino a quando non lo si trova.


Un po 'di comando shell

Questa è un'interpretazione un po 'personale.

Alcune delle cose che vale la pena menzionare, in questo caso specifico, sono comandi, opzioni, argomenti e pipe.

Questo è un po 'vagamente usato, ma nel mio vocabolario abbiamo in breve:

  • comando: un programma o incorporato .
  • parametro: un'entità dopo la parola di comando.
  • opzione: un opzionale parametro .
  • argomento: un parametro richiesto.

In una specifica di comando le parentesi quadre vengono utilizzate per specificare le opzioni e, facoltativamente, minore / maggiore di allora, utilizzate per specificare gli argomenti. Così:

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

Fornisce -a -be -scome parametri opzionali e fileuno richiesto. -tè facoltativo, ma se specificato accetta l'argomento richiesto bar. I punti indicano che possono essere necessari diversi file.

Questa non è una specifica esatta e spesso mano helpè necessaria per essere sicuri.

Il posizionamento delle opzioni e l'input degli argomenti possono essere spesso confusi, ma in genere è meglio attenersi a un approccio basato sulla posizione poiché alcuni sistemi non gestiscono il posizionamento misto degli argomenti. Come esempio:

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

Entrambi funzionano su alcuni sistemi, mentre quest'ultimo non su altri.


Nel tuo comando esatto appartengono tutti i parametri find, quindi se ti chiedi di una proprietà man findè il posto giusto in cui cercare. Nei casi in cui è necessario consultare le pagine man per la shell ecc., Ad esempio:

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

L' -execè uno speciale dove -exec some_command {} \;sono tutti parametri forniti find, ma la some_command {} \;parte è espanso, all'interno finddi some_command string_of_found_entity.


Più avanti

  • citando
  • espansione
  • sostituzione del comando
  • e molto di più

Potresti trovare questo utile .


Molto informativo.
Fredrick Gauss,

8

Devi guardare dentro man find, non dentro help typeo man bash. typein findspecificherà quale tipo di file è necessario:

   -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 il builtin typeè una cosa completamente diversa e NON è quella usata all'interno find.


0

Hai guardato la pagina del manuale sbagliata, questo non è il type -fcomando ma l' find -type fopzione che è abbastanza diversa, dai un'occhiata al findmanuale per le spiegazioni corrette.


0

-type fdice a find di stampare solo file di tipo f, ad esempio file semplici, non directory, non collegamenti simbolici e non file di dispositivi. man findquindi cerca l' -fopzione.


0

Questa non è la pagina di manuale corretta che stai guardando. Dovresti usare

man find

che ti dirà che con -type fil -typepredicato seleziona solo i file normali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.