Come dire che un comando shell è programma o funzione?


8

Vorrei sapere se i comandi che chiamiamo nella shell sono funzioni o programmi .


1
Che distinzione stai facendo tra "piccolo programma" e "funzione"?
JdeBP,

È possibile immettere comandi in un programma shell che consente di programmare la shell affinché funzioni e assumere i comandi utilizzando le funzioni con cui è stata programmata la shell per comandare altri programmi dalle funzioni shell.
txtechhelp,

Risposte:


15

Dipende.

I comandi possono rientrare in più categorie: builtin, alias, funzioni, eseguibili (script e binari nel percorso di ricerca).

Sulla riga di comando, questi occupano un unico spazio dei nomi piatto che rende possibile l'override. Esistono numerosi modi per distinguere i tipi di programmi:

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}

Sappiamo che fè una funzione.

$ which a
alias a='cat'
        /usr/bin/cat

Sappiamo che aè un alias.

$ which yes
/usr/bin/yes

Sappiamo che yesè un programma.

$ builtin echo ; echo $?

0

La shell ha un echobuiltin ...

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1

... ma nessuno per cat. Se c'è un builtin o un alias ma insisti nel chiamare invece il programma, aggiungi il prefisso al comando con una barra rovesciata:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0

3
Inoltre, un comando che è un programma in un'implementazione di * nix potrebbe diventare una shell incorporata (= funzione) in un'altra.
jamesqf,

1
@jamesqf, sì, le shell hanno strumenti standard integrati, ma i comandi integrati non sono gli stessi delle funzioni. Esegui ad esempiosh -c 'type true; f() { echo x; }; type f'
ilkkachu,

5
Si noti che in generale, typeè preferibile whichper quasi tutti gli scopi. Vedi unix.stackexchange.com/q/85249/135943
Wildcard

@ilkkachu: dipende dalla tua definizione di "uguale a". Naturalmente sono implementati in modo diverso, ma per l'utente ordinario che digita un comando, sono funzionalmente uguali.
jamesqf,

1
@jamesqf, anche se il tuo normale utente non (sa come) utilizzare le funzioni, affermare che sono le stesse dei builtin è semplicemente confuso.
ilkkachu,

4

La definizione di a functionsta restituendo valori singoli e non genera nulla. Le funzioni della shell in particolare possono benissimo e potrebbero avere un output o altri effetti collaterali, poiché il valore di ritorno delle funzioni è così limitato.

A commandè un'istruzione impartita da un utente per dire a un computer di fare qualcosa, ad esempio eseguendo un singolo programma o un gruppo di programmi collegati.

A programè una sequenza di istruzioni (ovvero comandi) che vengono fornite a un computer e comprensibili dall'unità centrale di elaborazione del computer (CPU). queste istruzioni indicano le operazioni che il computer deve eseguire su un set di dati.

Detto questo, functionssono un sottoinsieme logico del programma. Chiamare uno è interamente all'interno del tuo processo. Il commandè un programma (o una shell incorporato) può essere eseguita dalla shell dei comandi. Il comando implementa funzioni che eseguono un'attività. Il contrario non è corretto.


10
"una funzione restituisce un singolo valore e non genera nulla" - beh, forse in senso matematico. Ma nei linguaggi di programmazione imperativa, è davvero comune che "funzione" significhi solo una subroutine, che potrebbe fare qualsiasi cosa. E le funzioni di shell in particolare possono benissimo avere output o altri effetti collaterali, poiché il valore di ritorno delle funzioni è così limitato.
ilkkachu,

@ilkkachu. Grazie. Ho aggiornato la risposta. Non esitate a rivedere ;-)

3
Penso che queste definizioni provengano da un contesto di linguaggio di programmazione, non da un contesto di shell. Sì, so che il linguaggio shell è un linguaggio di programmazione, ma la sua idea di "funzione" è abbastanza diversa dalla definizione matematica o informatica - nella shell, tutti i comandi (siano essi integrati, funzioni, alias, programmi o script) agiscono allo stesso modo, e sono semplicemente diversi tipi di implementazione.
Toby Speight,

1
... * principalmente * allo stesso modo; i builtin possono cambiare lo stato della shell stessa, mentre i programmi esterni non possono chiamare chdir()o setenv()nella shell che è, per loro, un processo genitore distinto.
Charles Duffy,

1

Vorrei sapere se i comandi che chiamiamo nella shell sono funzioni o programmi?

Sì.

In particolare, quando si digita del testo e si preme enter, la shell deve determinare se è:

  1. un alias,
  2. una funzione,
  3. un comando integrato,
  4. un file eseguibile.
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.