argumentos estándar y de línea de comando

argumentos estándar y de línea de comando

Aquí hay un script para verificar cuál es la fuente de stdin,

que es de How-to Geek: "¿Qué son stdin, stdout y stderr en Linux?"

https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/


#!/bin/bash

if [ -t 0 ]; then

  echo stdin coming from keyboard

else

  echo stdin coming from a pipe or a file

fi

Entonces, si algún comando se ejecuta con argumentos o la sustitución del comando, ¿no tiene relación con stdin? En tal caso, ¿está stdinvacío?

Y aunque puedo entender el significado de stdinvenir de una tubería o de un archivo, ¿cuál es el significado de stdinvenir del teclado? ¿Es como escribir una tecla para readun comando o un documento?

Agradecer a la comunidad por su apoyo diario.

Respuesta1

Para desmitificar la diferencia entre command line argumentsy stdin. Voy a dividir mi respuesta en varias partes para explicar los conceptos subyacentes. Entonces responde a tu pregunta.

Antes de comenzar a explicar, tenga en cuenta lo siguiente:

  1. En Linux todo se considera un archivo.
  2. Supongo que ha leído la publicación completa proporcionada en la pregunta.
  3. Voy a utilizar la ayuda del programa C para explicar la diferencia, por lo que supongo que conoces la sintaxis básica. Aún así explicaré todo lo que pueda.

argumentos estándar y de línea de comando

La entrada estándar es un archivo de Linux al que acceden los programas para recibir información del usuario. Ningún programa puede interactuar directamente con el teclado, sino que interactúa con stdin. Entonces, si un programa necesita recibir una entrada del usuario, accederá stdin.

Cuando usa la redirección ( > or <) o canaliza ( |) con otro comando, manipula los flujos de entrada y salida, es decir, stdiny stdout. Cuando especifica estos caracteres especiales, le indican stdincómo stdoutfuncionar. En Linux, stdines /proc/self/fd/0y stdoutes/proc/self/fd/1

Los argumentos de la línea de comando son básicamente un método para tomar información utilizada junto con la invocación del comando para hacer que el comando realice una tarea específica.No es necesario que todos y cada uno de los programas tengan argumentos de línea de comando, ya que corresponde al desarrollador del siguiente programa utilizarlos.

Los argumentos de la línea de comando se pasan a un comando como una matriz. (Una matriz es una estructura de datos que consta de una colección de elementos, cada uno identificado por al menos un índice o clave de matriz.). Por lo tanto, el programador puede utilizar los valores de esa matriz para agregar más funcionalidad a su programa.

Ejemplos de programa C

#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;
}

En el programa anterior, el programa no toma ninguna entrada estándar del usuario, sin embargo, toma argumentos de línea de comando y funciona de manera diferente dependiendo del argumento que se proporciona o no.

argces una variable que almacena el recuento de argumentos pasados ​​y argves una matriz que almacena los argumentos pasados ​​al invocar el programa. argv[0]es el primer elemento de la matriz que contiene el nombre del programa en sí. Después de esa matriz contendrá los argumentos pasados.

Cuando ejecuto el siguiente programa escribiendo "./batman", obtengo el siguiente resultado:

Uso: ./batman

Pero cuando ejecuto el mismo programa escribiendo "./batman Bruce". Yo obtengo :

Bienvenido Maestro Bruce

Ahora bien, esto no significa que este programa no pueda recibir información. A continuación se muestra el programa modificado que toma tanto el argumento de la línea de comando como la entrada estándar.

#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;
}

Lo anterior toma un argumento de línea de comando y luego espera a que el usuario ingrese la contraseña a través de la entrada estándar.
Si no especificamos ningún argumento, arrojará un error como en el código C anterior.
A continuación se muestra el resultado cuando se ejecuta el programa:

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$

Después de pasar el argumento de la línea de comando, este programa esperó la contraseña que se suponía que debía ingresar el usuario, por lo tanto, a través destdin

¿Cuál es la conclusión entonces?

Espero que hayas entendido los conceptos que te expliqué anteriormente. Ahora es el momento de responder esas preguntas.

  1. Sí, los argumentos de la línea de comando no tienen relación stdiny stdinen ese caso solo apuntan a su dispositivo de entrada pero no se utilizan.
  2. stdinEste en sí es un archivo que, de forma predeterminada, apunta a su dispositivo de entrada y recibe información desde allí. Sin embargo, cuando proporciona una canalización o redirección en su comando, le indica que stdintome la entrada del archivo que especificó en lugar del dispositivo de entrada conectado a su computadora.

Si no entendiste el programa C, está bien. Esta vez usemos un comando incorporado en lugar de un programa personalizado.

Ejemplo de comando en lugar de programa:

cat file_name
cat < file_name

la salida será idéntica porque el desarrollador correspondiente catlee stdinlos datos del archivo, cuyo nombre se proporciona como el primer argumento de la línea de comando (que es el primer elemento de la matriz que el shell pasa a cat).

Posteriormente, cat escribe todo el contenido de file_name o stdinen la terminal, ya que no le indicamos al shell que lo manipule stdout. Recuerde que en la segunda línea su shell manipula stdinde esta manera, que ya no apunta a su dispositivo de entrada estándar sino que apunta a un archivo llamado nombre_archivo en su directorio de trabajo actual.Este ejemplo fue tomado de otra publicación, puedes hacer clic aquí para leer más

Espero que esto no solo le haya proporcionado la solución a la pregunta, sino que también le haya ayudado a comprender los conceptos subyacentes.

información relacionada