Onde os argumentos da linha de comando (por exemplo, 'some.text') são realmente passados?

2

Pelo que sei, os parâmetros que você passa para um comando vão para o seu fluxo STDIN.

então isso:

cut -d. -f2 'some.text'

deve ser perfeitamente idêntico a isto:

echo 'some.text' | cut -d. -f2

enquanto enviamos some.text para STDIN. No primeiro caso, através de um parâmetro, no segundo caso via pipe.

Onde o parâmetro some.text da primeira amostra vai, se não para STDIN?

    
por jw013 19.07.2012 / 16:27

5 respostas

0

STDIN e o comando do programa (incluindo argumentos) são coisas completamente diferentes. STDIN é um arquivo do qual o programa pode ler. Pode ser conectado a um terminal, um arquivo de disco, um dispositivo, um soquete, etc. O comando do programa é simplesmente um conjunto de seqüências de caracteres, o primeiro dos quais é o nome do programa. Eles são passados como argumentos para a função main() do programa.

    
por 19.07.2012 / 16:36
1

Não, os parâmetros passados através da linha de comando não são passados para STDIN automaticamente, mas são dados em variáveis separadas para o programa, que podem então interpretá-los como quiserem. As variáveis são normalmente chamadas de argc e argv.

Muitas das ferramentas Unix (corte, cabeça, cauda, gato, ...) podem obter entrada eithervia STDIN ou via arquivos na linha de comando.

Portanto, echo 'some.text' | cut -d. -f2 tem o mesmo efeito que

echo 'some.text' > temporary_file
cut -d. -f2 temporary_file
rm temporary_file
    
por 19.07.2012 / 16:37
1

Argumentos de linha de comando e entrada de programa não são equivalentes. Eles não viajam pelo mesmo caminho e são interpretados de maneira diferente.

O comando cut interpreta argumentos que começam com - como opções e outros como nomes de arquivos de entrada (como muitos outros comandos).

Os argumentos são passados para um programa por meio da execve chamada do sistema. O ambiente é passado ao lado dele. O programa pode ler seus argumentos de um determinado local na memória; As linguagens de programação geralmente fornecem uma variável ou função para acessar os argumentos, como o parâmetro argv para main em C .

A entrada padrão é descritor de arquivo 0. Trata-se, por convenção, de um arquivo pré-aberto que os programas podem ler . Quando você executa um comando em um terminal sem redirecionar sua entrada, a entrada padrão vem de um terminal (é o que você digita). Quando você redireciona a entrada de um arquivo com mycommand <input_file , a entrada padrão é conectada a esse arquivo. Quando você executa um comando em um pipeline command1 | command2 , a entrada padrão de command2 é conectada à entrada padrão de command2 .

    
por 20.07.2012 / 03:28
0

Parâmetros (também conhecidos como “argumentos de linha de comando”) vão para uma matriz de strings ( char *argv[] em C) que é passada para a função de ponto de entrada do programa. Eles não são passados via STDIN ou qualquer outro tubo.

Algumas ferramentas de linha de comando podem aceitar alguns argumentos também no STDIN (embora eu não consiga pensar em nenhum agora).

    
por 19.07.2012 / 16:36
0

Se você está se referindo a argumentos de linha de comando (por exemplo, -d -f2 e, no seu primeiro exemplo, 'some.text' ), todos eles vão para o programa associado.

Argumentos de linha de comando também podem conter informações que especificam para onde a saída vai ou a origem vem. Por exemplo, no primeiro exemplo, a presença de um nome de arquivo indica que os dados vêm de um arquivo, enquanto no segundo exemplo a falta de um nome de arquivo implica na entrada de stdin . Em ambos os casos, a saída vai para stdout .

    
por 19.07.2012 / 16:36