
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á stdin
vacío?
Y aunque puedo entender el significado de stdin
venir de una tubería o de un archivo, ¿cuál es el significado de stdin
venir del teclado? ¿Es como escribir una tecla para read
un comando o un documento?
Agradecer a la comunidad por su apoyo diario.
Respuesta1
Para desmitificar la diferencia entre command line arguments
y 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:
- En Linux todo se considera un archivo.
- Supongo que ha leído la publicación completa proporcionada en la pregunta.
- 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, stdin
y stdout
. Cuando especifica estos caracteres especiales, le indican stdin
cómo stdout
funcionar. En Linux, stdin
es /proc/self/fd/0
y stdout
es/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.
argc
es una variable que almacena el recuento de argumentos pasados y argv
es 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.- Sí, los argumentos de la línea de comando no tienen relación
stdin
ystdin
en ese caso solo apuntan a su dispositivo de entrada pero no se utilizan. stdin
Este 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 questdin
tome 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 cat
lee stdin
los 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 stdin
en la terminal, ya que no le indicamos al shell que lo manipule stdout
. Recuerde que en la segunda línea su shell manipula stdin
de 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.