
Aqui está um script para verificar qual é a fonte do stdin,
que é do How-to Geek: "O que são stdin, stdout e stderr no 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
Então, se algum comando for executado com argumentos ou substituição de comando, ele não tem relação com stdin
? Nesse caso, o stdin
vazio está vazio?
E embora eu possa entender o significado de stdin
vir de um cano ou de um arquivo, mas qual é o significado de stdin
vir do teclado? É como digitar uma tecla para read
comando ou aqui documento?
Agradeça à comunidade pelo apoio diário.
Responder1
Para desmistificar a diferença entre command line arguments
e stdin
. Vou dividir minha resposta em várias partes, explicando os conceitos subjacentes. Então responda sua pergunta.
Antes de começar a explicar, tenha em mente o seguinte:
- No Linux tudo é considerado um arquivo.
- Presumo que você leu toda a postagem fornecida na pergunta.
- Vou contar com a ajuda do programa C para explicar a diferença, portanto presumo que você conheça a sintaxe básica. Mesmo assim vou explicar o máximo que puder.
argumentos stdin e linha de comando
Entrada padrão é um arquivo Linux que é acessado por programas para receber informações do usuário. Qualquer programa não pode interagir diretamente com o teclado, em vez disso, eles interagem com o stdin
. Portanto, se um programa precisar receber uma entrada do usuário, ele acessará stdin
.
Quando você usa redirecionamento ( > or <
) ou pipe ( |
) com outro comando ele manipula os fluxos de entrada e saída, ou seja, stdin
e stdout
. Quando você especifica esses caracteres especiais, eles instruem stdin
como stdout
funcionar. No Linux, stdin
é /proc/self/fd/0
e stdout
é/proc/self/fd/1
Os argumentos da linha de comando são basicamente um método para obter informações usadas junto com a invocação do comando para fazer com que o comando execute alguma tarefa específica.Não é necessário que todo e qualquer programa tenha argumentos de linha de comando, pois cabe ao desenvolvedor do programa a seguir usá-los.
Os argumentos da linha de comando são passados para um comando como uma matriz. (Array é uma estrutura de dados que consiste em uma coleção de elementos, cada um identificado por pelo menos um índice ou chave de array.). Conseqüentemente, os valores nessa matriz podem ser usados pelo programador para adicionar mais funcionalidades ao seu programa.
Exemplos 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;
}
No programa acima, o programa não recebe nenhuma entrada padrão do usuário, mas aceita argumentos de linha de comando e funciona de maneira diferente dependendo do argumento fornecido ou não.
argc
é uma variável que armazena a contagem de argumentos passados e argv
é um array que armazena os argumentos passados ao invocar o programa. argv[0]
é o primeiro elemento da matriz que contém o nome do próprio programa. Depois desse array conterá os argumentos passados.
Quando executo o seguinte programa digitando "./batman", recebo a seguinte saída:
Uso: ./batman
Mas quando executo o mesmo programa digitando "./batman Bruce". Eu recebo :
Bem vindo Mestre Bruce
Agora, isso não significa que este programa não possa receber informações. Abaixo está o programa modificado que usa argumentos de linha de comando e entrada padrão.
#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;
}
O texto acima usa um argumento de linha de comando e espera que o usuário insira a senha por meio da entrada padrão.
Se não especificarmos nenhum argumento, ocorrerá um erro, assim como no código C anterior.
Abaixo está a saída quando o programa é executado:
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$
Após passar o argumento da linha de comando este programa esperou pela senha que deveria ser digitada pelo usuário, portanto atravésstdin
Qual é a conclusão então?
Espero que você tenha entendido os conceitos que expliquei acima. Agora é hora de responder a essas perguntas.- Sim, os argumentos da linha de comando não têm relação
stdin
e,stdin
nesse caso, estão apenas apontando para o seu dispositivo de entrada, mas não estão sendo usados. stdin
é em si um arquivo que, por padrão, aponta para o seu dispositivo de entrada e recebe a entrada de lá. No entanto, quando você fornece pipe ou redirecionamento em seu comando, ele informastdin
para obter a entrada do arquivo especificado em vez do dispositivo de entrada conectado ao seu computador.
Se você não entendeu o programa C, tudo bem. Desta vez vamos usar um comando embutido em vez de um programa personalizado.
Exemplo de comando em vez de programa:
cat file_name
cat < file_name
a saída será idêntica porque o desenvolvedor correspondente faz cat
a leitura de dados stdin
ou a leitura dos dados do arquivo, cujo nome é fornecido como o primeiro argumento da linha de comando (que é o primeiro elemento na matriz que o shell passa para cat).
Posteriormente, cat grava todo o conteúdo de file_name ou stdin
no terminal, pois não instruímos o shell a manipular stdout
. Lembre-se de que na segunda linha seu shell manipula stdin
dessa maneira, que não aponta mais para seu dispositivo de entrada padrão, mas aponta para um arquivo chamado file_name em seu diretório de trabalho atual.Este exemplo foi retirado de outro post, você pode clicar aqui para ler mais
Espero que isso não apenas tenha fornecido a solução para a questão, mas também tenha ajudado a compreender os conceitos subjacentes.