Vorrei sapere se i comandi che chiamiamo nella shell sono funzioni o programmi .
Vorrei sapere se i comandi che chiamiamo nella shell sono funzioni o programmi .
Risposte:
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
sh -c 'type true; f() { echo x; }; type f'
typeè preferibile whichper quasi tutti gli scopi. Vedi unix.stackexchange.com/q/85249/135943
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.
chdir()o setenv()nella shell che è, per loro, un processo genitore distinto.