stdin und Kommandozeilenargumente

stdin und Kommandozeilenargumente

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 stdinleer?

Und obwohl ich verstehe, was es bedeutet, wenn stdines von einer Pipe oder einer Datei kommt, was bedeutet es, wenn stdines von der Tastatur kommt? Ist es wie das Eintippen einer Taste für readeinen Befehl oder ein Dokument hier?

Danken Sie der Community für ihre tägliche Unterstützung.

Antwort1

Um den Unterschied zwischen command line argumentsund 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:

  1. Unter Linux wird alles als Datei betrachtet.
  2. Ich gehe davon aus, dass Sie den gesamten in der Frage enthaltenen Beitrag gelesen haben.
  3. 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. stdinund stdout. Wenn Sie diese Sonderzeichen angeben, weisen sie an stdin, stdoutwie zu funktionieren ist. Unter Linux stdinist /proc/self/fd/0und stdoutist/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.

argcist eine Variable, die die Anzahl der übergebenen Argumente speichert, und argvein 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.

  1. Ja, Befehlszeilenargumente haben keine Beziehung dazu stdinund stdinzeigen in diesem Fall nur auf Ihr Eingabegerät, werden aber nicht verwendet.
  2. stdinist 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, stdinEingaben 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 catentweder Daten aus der Datei liest stdinoder 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 stdinin das Terminal, da wir der Shell keine Anweisung zum Manipulieren geben stdout. Denken Sie daran, dass Ihre Shell in der zweiten Zeile stdinso 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.

verwandte Informationen