Command Execution With Arguments Have No Relation with Stdin?

Here is a script to check what the source is for stdin,

which is from How-to Geek: "What Are stdin, stdout, and stderr on 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

Then if any command is executed with arguments or the command substitution, does it have no relation with stdin? In such case, is the stdin empty?

And although I can understand the meaning of stdin coming from a pipe or a file, but what is the meaning of stdin coming from keyboard? Is it one like key typing for read command or here document?

Thank the community for its everyday's support.

0
задан 11 August 2020 в 08:45

1 ответ

Чтобы прояснить разницу между аргументами командной строки и stdin . Я собираюсь разделить свой ответ на несколько частей, объясняющих основные концепции. Затем ответьте на свой вопрос.

Прежде чем я начну объяснять, помните следующее:

  1. В Linux все рассматривается как файл.
  2. Я предполагаю, что вы прочитали весь пост, указанный в вопросе.
  3. Я собираюсь воспользоваться помощью программы C, чтобы объяснить разницу, поэтому я предполагаю, что вы знаете базовый синтаксис. Тем не менее, я объясню все, что смогу.

stdin и аргументы командной строки

Стандартный ввод - это файл Linux, к которому программы обращаются для получения ввода от пользователя. Ни одна программа не может напрямую взаимодействовать с клавиатурой, вместо этого они взаимодействуют с stdin . Поэтому, если программе требуется ввод данных от пользователя, она будет обращаться к stdin .

Когда вы используете перенаправление (> или <) или канал ( | ) с помощью другой команды он управляет потоками ввода и вывода, то есть stdin и stdout . Когда вы указываете эти специальные символы, они указывают stdin и stdout , как работать. В Linux stdin - это / proc / self / fd / 0 , а stdout - это / proc / self / fd / 1

Команда строковые аргументы - это, по сути, метод получения входных данных, используемый вместе с вызовом команды, чтобы заставить команду выполнять определенную задачу. Необязательно, чтобы каждая программа имела аргументы командной строки , так как разработчик следующей программы должен их использовать.

Аргументы командной строки передаются команде в виде массива. ( Массив - это структура данных, состоящая из набора элементов, каждый из которых идентифицируется по крайней мере одним индексом или ключом массива. ). Следовательно, значения в этом массиве могут быть использованы программистом для добавления дополнительных функций в свою программу.

Примеры программы на 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;
}

В приведенной выше программе программа не принимает никаких стандартных входных данных от пользователя, однако она принимает команду строковых аргументов и работает по-разному в зависимости от того, предоставлен аргумент или нет.

argc - это переменная, которая хранит количество переданных аргументов, а argv - это массив, в котором хранятся аргументы, переданные при вызове программа. argv [0] - это первый элемент в массиве, который содержит имя самой программы. После этого массив будет содержать переданные аргументы.

Когда я выполняю следующую программу, набирая "./batman", я получаю следующий результат:

Использование: ./batman

Но когда я выполняю ту же программу, набирая "./batman Bruce". Я получаю:

Добро пожаловать, мастер Брюс

Это не значит, что эта программа не может принимать ввод. Ниже представлена ​​модифицированная программа, которая принимает как аргумент командной строки, так и стандартный ввод.

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

Вышеупомянутое принимает аргумент командной строки, а затем ждет, пока пользователь введет пароль через стандартный ввод.
Если мы не укажем аргумент, будет выдана ошибка, как и в предыдущем коде C.
Ниже приведены результаты выполнения программы:

 zero @ HP-Notebook : ~ / Desktop / Practice / cpp $ ./batman3 Bruce
Добро пожаловать, мастер Брюс
Пожалуйста, предоставьте пароль: 1234
Доступ к Batcave разрешен
zero @ HP-Notebook : ~ / Desktop / Practice / cpp $ ./batman3 Joker
Добро пожаловать, Мастер Джокер
Пожалуйста, укажите пароль: 123
Доступ к Batcave отклонен
zero @ HP-Notebook : ~ / Desktop / Practice / cpp $

После передачи аргумента командной строки эта программа ждала пароля, который должен был ввести пользователь, следовательно, через stdin

Каков же вывод?

Надеюсь, вы поняли концепции, которые я объяснил выше. А теперь пора ответить на эти вопросы.

  1. Да, аргументы командной строки не имеют отношения к stdin и stdin в этом случае просто указывает на ваше устройство ввода, но не используется.
  2. stdin сам по себе является файлом, который по умолчанию указывает на ваше устройство ввода и принимает оттуда ввод. Однако, когда вы указываете канал или перенаправление в своей команде, он сообщает stdin принимать входные данные из указанного вами файла вместо устройства ввода, подключенного к вашему компьютеру.

Если вы не понимали программу C, это хорошо. На этот раз позволяет использовать встроенную команду вместо специальной программы.

Пример команды вместо программы:

cat file_name
cat < file_name

вывод будет идентичным, потому что соответствующий разработчик заставляет cat либо читать данные из stdin , либо читать данные из файла, имя которого указано в качестве первого аргумента командной строки. (который является первым элементом в массиве, который оболочка передает в cat).

Впоследствии cat записывает все содержимое file_name или stdin в терминал, поскольку мы не инструктируем оболочку манипулировать ] стандартный вывод . Помните, что во второй строке ваша оболочка манипулирует stdin таким образом, что она больше не указывает на ваше стандартное устройство ввода, а указывает на файл с именем file_name в вашем текущем рабочем каталоге. Этот пример взят из другого сообщения, вы можете щелкнуть здесь, чтобы узнать больше

Я надеюсь, что это не только дало вам решение вопроса, но и помогло вам понять основные концепции.

0
ответ дан 11 August 2020 в 20:05

Другие вопросы по тегам:

Похожие вопросы: