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.
Чтобы прояснить разницу между аргументами командной строки
и stdin
. Я собираюсь разделить свой ответ на несколько частей, объясняющих основные концепции. Затем ответьте на свой вопрос.
Прежде чем я начну объяснять, помните следующее:
Стандартный ввод - это файл Linux, к которому программы обращаются для получения ввода от пользователя. Ни одна программа не может напрямую взаимодействовать с клавиатурой, вместо этого они взаимодействуют с stdin
. Поэтому, если программе требуется ввод данных от пользователя, она будет обращаться к stdin
.
Когда вы используете перенаправление (> или <
) или канал ( |
) с помощью другой команды он управляет потоками ввода и вывода, то есть stdin
и stdout
. Когда вы указываете эти специальные символы, они указывают stdin
и stdout
, как работать. В Linux stdin
- это / proc / self / fd / 0
, а stdout
- это / proc / self / fd / 1
Команда строковые аргументы - это, по сути, метод получения входных данных, используемый вместе с вызовом команды, чтобы заставить команду выполнять определенную задачу. Необязательно, чтобы каждая программа имела аргументы командной строки , так как разработчик следующей программы должен их использовать.
Аргументы командной строки передаются команде в виде массива. ( Массив - это структура данных, состоящая из набора элементов, каждый из которых идентифицируется по крайней мере одним индексом или ключом массива. ). Следовательно, значения в этом массиве могут быть использованы программистом для добавления дополнительных функций в свою программу.
#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
stdin
и stdin
в этом случае просто указывает на ваше устройство ввода, но не используется. stdin
сам по себе является файлом, который по умолчанию указывает на ваше устройство ввода и принимает оттуда ввод. Однако, когда вы указываете канал или перенаправление в своей команде, он сообщает stdin
принимать входные данные из указанного вами файла вместо устройства ввода, подключенного к вашему компьютеру. Если вы не понимали программу C, это хорошо. На этот раз позволяет использовать встроенную команду вместо специальной программы.
Пример команды вместо программы:
cat file_name
cat < file_name
вывод будет идентичным, потому что соответствующий разработчик заставляет cat
либо читать данные из stdin
, либо читать данные из файла, имя которого указано в качестве первого аргумента командной строки. (который является первым элементом в массиве, который оболочка передает в cat).
Впоследствии cat записывает все содержимое file_name или stdin
в терминал, поскольку мы не инструктируем оболочку манипулировать ] стандартный вывод
. Помните, что во второй строке ваша оболочка манипулирует stdin
таким образом, что она больше не указывает на ваше стандартное устройство ввода, а указывает на файл с именем file_name в вашем текущем рабочем каталоге. Этот пример взят из другого сообщения, вы можете щелкнуть здесь, чтобы узнать больше
Я надеюсь, что это не только дало вам решение вопроса, но и помогло вам понять основные концепции.