
Hier ist ein Skript, um zu prüfen, was die Quelle für stdin ist,
das stammt von How-to Geek: „Was sind stdin, stdout und stderr unter Linux?“
https://www.howtogeek.com/435903/was-sind-stdin-stdout-und-stderr-unter-linux/
#!/bin/bash
if [ -t 0 ]; then
echo stdin coming from keyboard
else
echo stdin coming from a pipe or a file
fi
Wenn dann ein beliebiger Befehl mit Argumenten oder Befehlsersetzung ausgeführt wird, hat dieser dann keine Beziehung zu stdin
? Ist in einem solchen Fall das stdin
leer?
Und obwohl ich verstehe, was es bedeutet, wenn stdin
es von einer Pipe oder einer Datei kommt, was bedeutet es, wenn stdin
es von der Tastatur kommt? Ist es wie das Eintippen einer Taste für read
einen Befehl oder ein Dokument hier?
Danken Sie der Community für ihre tägliche Unterstützung.
Antwort1
Um den Unterschied zwischen command line arguments
und zu entmystifizieren stdin
, werde ich meine Antwort in mehrere Teile aufteilen, in denen die zugrunde liegenden Konzepte erläutert werden. Beantworten Sie dann Ihre Frage.
Bevor ich mit den Erklärungen beginne, beachten Sie bitte Folgendes:
- Unter Linux wird alles als Datei betrachtet.
- Ich gehe davon aus, dass Sie den gesamten in der Frage enthaltenen Beitrag gelesen haben.
- Ich werde ein C-Programm zu Hilfe nehmen, um den Unterschied zu erklären. Daher gehe ich davon aus, dass Sie die grundlegende Syntax kennen. Trotzdem werde ich so viel erklären, wie ich kann.
stdin und Kommandozeilenargumente
Standard Input ist eine Datei unter Linux, auf die Programme zugreifen, um Benutzereingaben entgegenzunehmen. Programme können nicht direkt mit der Tastatur interagieren, sondern mit stdin
. Wenn ein Programm also eine Benutzereingabe entgegennehmen muss, greift es auf zu stdin
.
Wenn Sie Umleitung ( > or <
) oder Pipe ( |
) mit anderen Befehlen verwenden, manipuliert es die Eingabe- und Ausgabeströme, d. h. stdin
und stdout
. Wenn Sie diese Sonderzeichen angeben, weisen sie an stdin
, stdout
wie zu funktionieren ist. Unter Linux stdin
ist /proc/self/fd/0
und stdout
ist/proc/self/fd/1
Befehlszeilenargumente sind grundsätzlich eine Methode zum Erfassen von Eingaben, die zusammen mit dem Aufruf eines Befehls verwendet werden, um den Befehl eine bestimmte Aufgabe ausführen zu lassen.Es ist nicht notwendig, dass jedes Programm Kommandozeilenargumente hat, da es dem Entwickler des folgenden Programms überlassen ist, diese zu verwenden.
Befehlszeilenargumente werden als Array an einen Befehl übergeben. (Ein Array ist eine Datenstruktur, die aus einer Sammlung von Elementen besteht, von denen jedes durch mindestens einen Array-Index oder Schlüssel identifiziert wird.). Daher können die Werte in diesem Array vom Programmierer verwendet werden, um seinem Programm weitere Funktionalität hinzuzufügen.
Beispiele für C-Programme
#include<stdio.h>
int main(int argc, char *argv[]) {
if(argc==2)
printf("Welcome Master %s\n", argv[1]);
else {
fprintf(stderr, "Usage : %s <name>\n", argv[0]);
return 1;
}
return 0;
}
Im obigen Programm akzeptiert das Programm keine Standardeingaben vom Benutzer, jedoch Befehlszeilenargumente und funktioniert unterschiedlich, je nachdem, ob das Argument angegeben wird oder nicht.
argc
ist eine Variable, die die Anzahl der übergebenen Argumente speichert, und argv
ein Array, das die beim Aufruf des Programms übergebenen Argumente speichert. argv[0]
ist das erste Element im Array, das den Namen des Programms selbst enthält. Danach enthält das Array die übergebenen Argumente.
Wenn ich das folgende Programm durch Eingabe von "./batman" ausführe, erhalte ich folgende Ausgabe:
Verwendung: ./batman
Aber wenn ich dasselbe Programm ausführe, indem ich „./batman Bruce“ eingebe, erhalte ich:
Willkommen, Master Bruce
Das bedeutet jedoch nicht, dass dieses Programm keine Eingaben verarbeiten kann. Unten sehen Sie ein modifiziertes Programm, das sowohl Befehlszeilenargumente als auch Standardeingaben verarbeitet.
#include<stdio.h>
int main(int argc, char *argv[]) {
int pass = 0;
if(argc==2){
printf("Welcome Master %s\n", argv[1]);
printf("Kindly provide password : ");
scanf("%d", &pass);
if(pass==1234)
printf("Batcave Access granted\n");
else
printf("Batcave Access declined\n");
}
else {
fprintf(stderr, "Usage : %s <name>\n", argv[0]);
return 1;
}
return 0;
}
Das Obige nimmt ein Befehlszeilenargument und wartet dann, bis der Benutzer das Passwort über die Standardeingabe eingibt.
Wenn wir kein Argument angeben, wird wie im vorherigen C-Code ein Fehler ausgegeben.
Unten sehen Sie die Ausgabe, wenn das Programm ausgeführt wird:
mars@HP-Notebook:~/Desktop/Practice/cpp$ ./batman3 Bruce Welcome Master Bruce Kindly provide password : 1234 Batcave Access granted mars@HP-Notebook:~/Desktop/Practice/cpp$ ./batman3 Joker Welcome Master Joker Kindly provide password : 123 Batcave Access declined mars@HP-Notebook:~/Desktop/Practice/cpp$
Nach der Übergabe des Kommandozeilenarguments wartete dieses Programm auf das Passwort, das vom Benutzer eingegeben werden sollte, also durchstdin
Was ist dann die Schlussfolgerung?
Ich hoffe, Sie haben die oben erläuterten Konzepte verstanden. Jetzt ist es Zeit, diese Fragen zu beantworten.- Ja, Befehlszeilenargumente haben keine Beziehung dazu
stdin
undstdin
zeigen in diesem Fall nur auf Ihr Eingabegerät, werden aber nicht verwendet. stdin
ist selbst eine Datei, die standardmäßig auf Ihr Eingabegerät verweist und von dort Eingaben entgegennimmt. Wenn Sie jedoch in Ihrem Befehl eine Pipe oder Umleitung angeben, wird das Gerät angewiesen,stdin
Eingaben aus der von Ihnen angegebenen Datei entgegenzunehmen, anstatt von dem an Ihren Computer angeschlossenen Eingabegerät.
Wenn Sie das C-Programm nicht verstanden haben, ist das in Ordnung. Dieses Mal verwenden wir einen integrierten Befehl anstelle eines benutzerdefinierten Programms.
Beispiel für Befehl statt Programm:
cat file_name
cat < file_name
die Ausgabe wird identisch sein, weil der entsprechende Entwickler cat
entweder Daten aus der Datei liest stdin
oder die Daten aus der Datei liest, deren Name als erstes Befehlszeilenargument angegeben ist (das ist das erste Element im Array, das die Shell an cat übergibt).
Anschließend schreibt cat den gesamten Inhalt von file_name oder stdin
in das Terminal, da wir der Shell keine Anweisung zum Manipulieren geben stdout
. Denken Sie daran, dass Ihre Shell in der zweiten Zeile stdin
so manipuliert, dass sie nicht mehr auf Ihr Standardeingabegerät, sondern auf eine Datei namens file_name in Ihrem aktuellen Arbeitsverzeichnis zeigt.Dieses Beispiel wurde einem anderen Beitrag entnommen. Klicken Sie hier, um mehr zu lesen.
Ich hoffe, dass Ihnen dies nicht nur die Lösung der Frage geliefert, sondern auch geholfen hat, die zugrunde liegenden Konzepte zu verstehen.