Wie kann man feststellen, dass ein Shell-Befehl ein Programm oder eine Funktion ist?

8

Ich würde gerne wissen, ob die Befehle , die wir in der Shell aufrufen, Funktionen oder Programme sind .

AymenTM
quelle
1
Welchen Unterschied machen Sie zwischen "kleinem Programm" und "Funktion"?
JdeBP
Sie können Befehle in ein Shell-Programm eingeben, mit denen Sie die Shell so programmieren können, dass sie funktioniert, und Befehle mithilfe von Funktionen übernehmen, mit denen die Shell programmiert wurde, um andere Programme aus den Shell-Funktionen heraus zu befehlen.
txtechhelp

Antworten:

15

Es hängt davon ab, ob.

Befehle können in mehrere Kategorien unterteilt werden: integrierte Funktionen, Aliase, Funktionen, ausführbare Dateien (Skripts und Binärdateien im Suchpfad).

In der Befehlszeile belegen diese einen einzelnen, flachen Namespace, der das Überschreiben ermöglicht. Es gibt zahlreiche Möglichkeiten, Arten von Programmen voneinander zu unterscheiden:

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

Wir wissen, dass fdas eine Funktion ist.

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

Wir wissen, dass dies aein Alias ​​ist.

$ which yes
/usr/bin/yes

Wir wissen, dass yesdas ein Programm ist.

$ builtin echo ; echo $?

0

Die Schale hat eine echoeingebaute…

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

… Aber keine für cat. Wenn es einen eingebauten oder einen Alias ​​gibt, Sie aber darauf bestehen, stattdessen das Programm aufzurufen, stellen Sie dem Befehl einen Backslash voran:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
phg
quelle
3
Ein Befehl, der ein Programm in einer Implementierung von * nix ist, kann auch zu einer in einer anderen integrierten Shell (= Funktion) werden.
Jamesqf
1
@jamesqf, ja, in Shell sind Standardwerkzeuge integriert, aber eingebaute Befehle sind nicht dasselbe wie Funktionen. Führen Sie zBsh -c 'type true; f() { echo x; }; type f'
ilkkachu
5
Beachten Sie, dass dies im Allgemeinen für fast alle Zwecke typevorzuziehen ist which. Siehe unix.stackexchange.com/q/85249/135943
Wildcard
@ilkkachu: Das hängt von deiner Definition von "das gleiche wie" ab. Natürlich sind sie unterschiedlich implementiert, aber für den normalen Benutzer, der einen Befehl eingibt, sind sie funktional gleich.
Jamesqf
1
@jamesqf, selbst wenn Ihr gewöhnlicher Benutzer keine Funktionen verwendet (weiß), ist die Behauptung, dass sie mit den integrierten Funktionen identisch sind, nur verwirrend.
Ilkkachu
4

Die Definition von a functiongibt einzelne Werte zurück und gibt nichts aus. Insbesondere Shell-Funktionen können sehr gut eine Ausgabe oder andere Nebenwirkungen haben, da der Rückgabewert von Funktionen so begrenzt ist.

A commandist eine Anweisung eines Benutzers, einen Computer anzuweisen, etwas zu tun, beispielsweise ein einzelnes Programm oder eine Gruppe verknüpfter Programme auszuführen.

A programist eine Folge von Anweisungen (dh Befehlen), die einem Computer gegeben werden und von der Zentraleinheit (CPU) des Computers verstanden werden können. Diese Anweisungen geben an, welche Vorgänge der Computer an einem Datensatz ausführen soll.

Allerdings functionssind logische Teilmenge des Programms. Das Anrufen einer Person liegt ganz in Ihrem Prozess. Das commandist ein Programm (oder eine eingebaute Shell), das über die Befehlsshell ausgeführt werden kann. Der Befehl implementiert Funktionen, die eine Aufgabe ausführen. Das Gegenteil ist nicht richtig.


quelle
10
"Eine Funktion gibt einen einzelnen Wert zurück und gibt nichts aus" - na ja, vielleicht im mathematischen Sinne. In imperativen Programmiersprachen bedeutet "Funktion" jedoch häufig nur eine Unterroutine, die alles kann. Insbesondere Shell-Funktionen können sehr wohl Ausgabe- oder andere Nebenwirkungen haben, da der Rückgabewert von Funktionen so begrenzt ist.
Ilkkachu
@ilkkachu. Vielen Dank. Ich habe die Antwort aktualisiert. Bitte
3
Ich denke, diese Definitionen stammen aus einem Programmiersprachenkontext, nicht aus einem Shell-Kontext. Ja, ich weiß , die Shell - Sprache ist eine Programmiersprache, aber seine Idee einer „Funktion“ ist ganz anders als die mathematische oder informatik Definition - in der Schale, alle Befehle (ob builtins, Funktionen, Aliase, Programmen oder Skripte) Akt gleich und sind einfach verschiedene Arten der Implementierung.
Toby Speight
1
... * meistens * gleich; Builtins können den Status der Shell selbst ändern, während externe Programme nicht aufrufen können chdir()oder setenv()in der Shell, die für sie ein eindeutiger übergeordneter Prozess ist.
Charles Duffy
1

Ich möchte wissen, ob die Befehle, die wir in der Shell aufrufen, Funktionen oder Programme sind.

Ja.

Insbesondere wenn Sie Text eingeben und drücken enter, muss die Shell bestimmen, ob:

  1. ein alias,
  2. eine Funktion,
  3. ein eingebauter Befehl,
  4. eine ausführbare Datei.
RonJohn
quelle