
다음은 stdin의 소스가 무엇인지 확인하는 스크립트입니다.
How-to Geek의 "Linux에서 stdin, stdout 및 stderr은 무엇입니까?"에서 발췌한 것입니다.
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
그러면 인수나 명령 대체를 사용하여 명령을 실행하면 stdin
? 이런 경우에는 stdin
비어 있습니까?
stdin
파이프나 파일에서 오는 의미는 이해할 수 있지만 stdin
키보드에서 오는 의미는 무엇입니까? read
명령이나 여기 문서 에 대한 키 입력과 같은 것입니까 ?
매일의 지원에 대해 커뮤니티에 감사드립니다.
답변1
command line arguments
와 의 차이점을 이해하기 위해 stdin
. 내 답변을 기본 개념을 설명하는 여러 부분으로 나눌 것입니다. 그런 다음 질문에 대답하십시오.
설명을 시작하기 전에 다음 사항을 명심하세요.
- Linux에서는 모든 것이 파일로 간주됩니다.
- 질문에 제공된 전체 게시물을 읽었다고 가정합니다.
- 차이점을 설명하기 위해 C 프로그램의 도움을 받을 것이므로 기본 구문을 알고 있다고 가정합니다. 그래도 최대한 설명하겠습니다.
stdin 및 명령줄 인수
표준 입력은 사용자로부터 입력을 받기 위해 프로그램에서 액세스하는 Linux 파일입니다. 모든 프로그램은 키보드와 직접 상호 작용할 수 없지만 stdin
. 따라서 프로그램이 사용자로부터 입력을 받아야 하는 경우 액세스합니다 stdin
.
> or <
리디렉션( ) 또는 파이프( )를 다른 명령과 함께 사용하면 |
입력 및 출력 스트림(예: 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 코드와 마찬가지로 오류가 발생합니다.
아래는 프로그램이 실행될 때의 출력입니다.
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$
명령줄 인수를 전달한 후 이 프로그램은 사용자가 입력해야 하는 비밀번호를 기다렸습니다.stdin
그러면 결론은 무엇입니까?
위에서 설명한 개념을 이해하셨기를 바랍니다. 이제 그 질문에 답할 시간입니다.stdin
예, 명령줄 인수는 아무 관련 이 없으며stdin
이 경우 입력 장치를 가리키기만 하고 사용되지는 않습니다.stdin
자체는 기본적으로 입력 장치를 가리키고 거기에서 입력을 받는 파일입니다. 그러나 명령에 파이프나 리디렉션을 제공하면stdin
컴퓨터에 연결된 입력 장치 대신 지정한 파일에서 입력을 받도록 지시합니다.
C 프로그램을 이해하지 못했다면 괜찮습니다. 이번에는 맞춤 제작 프로그램 대신 내장된 명령을 사용해 보겠습니다.
프로그램 대신 명령의 예:
cat file_name
cat < file_name
cat
해당 개발자가 파일 에서 데이터를 읽 거나 파일에서 데이터를 읽도록 하기 때문에 출력은 동일합니다. stdin
파일의 이름은 첫 번째 명령줄 인수(셸이 cat에 전달하는 배열의 첫 번째 요소임)로 제공됩니다.
그 후 cat은 쉘에 조작을 지시하지 않기 때문에 file_name의 전체 내용을 stdin
터미널에 기록합니다 stdout
. 두 번째 줄에서는 쉘이 stdin
이런 방식으로 조작한다는 점, 즉 더 이상 표준 입력 장치를 가리키지 않고 현재 작업 디렉터리에 있는 file_name이라는 파일을 가리킨다는 점을 기억하세요.이 예는 다른 게시물에서 가져온 것입니다. 자세한 내용을 보려면 여기를 클릭하세요.
이것이 질문에 대한 해결책을 제공했을 뿐만 아니라 기본 개념을 이해하는 데에도 도움이 되기를 바랍니다.