argumentos stdin e linha de comando

argumentos stdin e linha de comando

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 stdinvazio está vazio?

E embora eu possa entender o significado de stdinvir de um cano ou de um arquivo, mas qual é o significado de stdinvir do teclado? É como digitar uma tecla para readcomando ou aqui documento?

Agradeça à comunidade pelo apoio diário.

Responder1

Para desmistificar a diferença entre command line argumentse 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:

  1. No Linux tudo é considerado um arquivo.
  2. Presumo que você leu toda a postagem fornecida na pergunta.
  3. 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, stdine stdout. Quando você especifica esses caracteres especiais, eles instruem stdincomo stdoutfuncionar. No Linux, stdiné /proc/self/fd/0e 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.

  1. Sim, os argumentos da linha de comando não têm relação stdine, stdinnesse caso, estão apenas apontando para o seu dispositivo de entrada, mas não estão sendo usados.
  2. 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 informa stdinpara 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 cata leitura de dados stdinou 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 stdinno terminal, pois não instruímos o shell a manipular stdout. Lembre-se de que na segunda linha seu shell manipula stdindessa 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.

informação relacionada