'Cat' è una shell integrata o un programma esterno?


33

Quando uso il typecomando per scoprire se catè incorporato un programma shell o un programma esterno ottengo l'output seguente:

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

Questo significa che catè un programma esterno che è /bin/cat?

Mi sono confuso, perché quando ho controllato l'output qui sotto echoho visto che è built-inun programma ma anche un programma/bin/echo

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

Quindi non ho potuto usare la logica che /bin/catsignifica necessariamente un programma esterno, perché l'eco era /bin/echoma era ancora integrato.

Quindi, come faccio a sapere cos'è cat? Integrato o esterno?


1
-Il comando cat è un programma esterno che fa parte del sistema, poiché le molte azioni che può eseguire non sono un semplice built-in.
Joke Sr. OK,

12
type whichpotrebbe darti la risposta perché whichnon ti darà la risposta.
Dubu,

1
Dipende dalla shell che stai usando
nsn

6
Curiosità: entrambi cate lssono / sono stati scritti dallo stesso Stallman. Saresti sorpreso di quante cose ha scritto. Non dimenticare che ha scritto le prime versioni del compilatore che è oggi il miglior compilatore al mondo che compila TUTTO e la maggior parte dei programmi di utilità principali. Sto solo dicendo
Alec Teal, l'

2
@AlecTeal Ti rendi conto che la maggior parte dei sistemi Unix usano versioni di ls e cat che precedono da tempo le versioni GNU a cui Richard Stallman aveva una mano?
Ross Ridge,

Risposte:


59

typeti dice cosa userebbe la shell. Per esempio:

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

Ciò significa che se al prompt di bash digiti echo, otterrai il built-in. Se si specifica il percorso, come in /bin/echo, si otterrà il comando esterno.

which, al contrario, è un programma esterno che non ha una conoscenza specifica di cosa farà la shell. Su sistemi simil-debian, whichè uno script di shell che cerca il PERCORSO per l'eseguibile. Pertanto, ti darà il nome dell'eseguibile esterno anche se la shell usasse un built-in.

Se un comando è disponibile solo come integrato, whichnon restituirà nulla:

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

Ora diamo un'occhiata a cat:

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

cat è un eseguibile esterno, non un built-in della shell.


5
Potresti type -all echoscoprire (in ordine) quali sono i diversi "echi" noti alla shell (il primo è quello che la shell chiamerà, se non specifichi qualcosa per cambiare l'ordine, come invocare "echo"o \echo, o command echo)
Olivier Dulac il

Buona risposta. Un'aggiunta: ci sono due versioni di echoper motivi storici. È iniziato come comando esterno, quindi è stato aggiunto come incorporato. Le prime versioni della shell Bourne ( /bin/sh) non ce l'avevano. /bin/echoè stato mantenuto per compatibilità, poiché da esso dipendeva ogni sorta di cose. (È successa la stessa cosa test.)
Alexis,

Nota a margine: esso whichstesso può essere un cmd incorporato della shell, ad esempio in tcsh:which which which: shell built-in command.
Dan Cornilescu,

Sto arrivando tardi alla festa, ma perché non controlli la sua pagina man e puoi effettivamente vedere il numero tra parentesi, il che indica se si tratta di una shell incorporata o altro
poz2k4444

46

cat is hashed (/bin/cat)è proprio come cat is /bin/cat(cioè, è un programma esterno ).

La differenza è che hai già eseguito catin questa sessione, quindi bash ha già cercato $PATHe memorizzato la posizione risultante in una tabella hash in modo che non debba cercarla di nuovo in questa sessione.

Per vedere tutti i comandi che sono stati sottoposti a hash nella tua sessione, esegui 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
In realtà, secondo me questa è l'unica risposta che risponde alla tua domanda :)
André Chalella,

IMHO questo ^^^ è vero. Questa risposta dovrebbe essere quella accettata.
LinuxSecurityFreak

4

Un altro modo per controllare l'elenco dei comandi incorporati della shell: usare compgenquale shell è incorporata da sola!

Il seguente comando elenca tutti i comandi incorporati della shell:

compgen -b

Puoi verificare cat, echogreping come: -

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

Puoi vedere i compgen -b | grep catritorni senza output, significa che catnon è incorporato nella shell .

Visita un elenco di utili opzioni fornite da compgen.


Puoi anche usare un altro comando incorporato: helpper visualizzare shell-builtin.

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

Non riesco a trovare alcuna documentazione formale per queste opzioni, sai dove esiste?
Casuale 832

@ Random832 stai parlando di opzioni per compgen?
Pandya,

sì, non ho trovato nulla nella manpage di Bash su cosa significhino -b o metà delle altre opzioni. L'ho trovato più tardi su gnu.org/software/bash/manual/html_node/…
Random832

@ Random832 tenta man bash | grep -e '-A action$' -A 32probabilmente ottenere un output simile a questo . (aumenta / diminuisci la cifra dopo -Aper gestirla correttamente).
Pandya,

4

Puoi anche usare il comando whereische è più efficiente perché mostra dove si trova il comando sulla macchina come anche la libreria di pagine di manuale, ecc.


-Scusami per il mio pessimo inglese, perché sto solo imparando ancora e non così bene usando! ...
Joke Sr. OK

2

Altri hanno già risposto cat, vorrei solo spiegare il problema con echo. Se usi l' -aopzione del tipo (elenca tutte le corrispondenze), vedrai che echoè sia una shell incorporata che un programma esterno:

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

I due sono completamente indipendenti l'uno dall'altro. typesenza opzioni restituirà semplicemente il primo comando corrispondente trovato. Quindi, digitare footi mostrerà cosa verrà eseguito se corri foo. Potrebbero esserci altre opzioni, ma queste non verranno visualizzate se non utilizzate -a.


2

Dal momento che ci sono diverse buone risposte qui sull'uso di type per scoprire se un comando come catun builtin o un programma esterno. Prenderò un approccio più generale. Ci sono alcuni comandi che devono essere integrati perché influenzano la shell corrente. Tre esempi classici sono cd, exece exit. Ci sono alcuni comandi che non devono essere incorporati perché la loro funzionalità dipende dal comportamento di execve o delle chiamate di sistema. Esempi di tali programmi includono su, sudo, califee super. Tutti gli altri comandi possono essere creati come builtin o programmi esterni.catè un ottimo programma di esempio di questa classe in quanto vi sono shell che lo includono come builtin e shell che non lo fanno. Vale la pena notare che molti comandi di questa classe che sono disponibili come builtin sono disponibili anche come programmi esterni.

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.