이전 명령이 STDOUT에 기록되는 동안 STDIN에 다른 명령을 입력해도 안전합니까?

이전 명령이 STDOUT에 기록되는 동안 STDIN에 다른 명령을 입력해도 안전합니까?

아마도 이 질문은 이전에 답변된 적이 있을 것입니다. 다른 답변에 대한 링크를 환영합니다...

bash다음과 같이 (셸 에서) 쉘 명령을 실행하면 :

make

그런 다음 명령 출력이 make명령 앞에서 스크롤되면서 첫 번째 명령 실행이 완료되기 전에 입력하고 누르면 명령이 최종적으로 완료되면 다음 명령이 즉시 시작되고 실행됩니다.STDOUTmakemake checkentermakemake check

내 질문은 간단합니다.

  1. 이거 위험한가요?
  2. 이렇게 성급하게 입력하면 예상치 못한 동작이 발생합니까?
  3. 왜 이런 일이 발생합니까?

답변1

이렇게 작동하는 이유는 유닉스가 전이중(full duplex)이기 때문이다. 부자가 말한 대로UNIX 시분할 시스템: 검토:

일단 익숙해지면 놀라운 차이를 만들어내는 사소해 보이는 것 중 하나는 전이중 터미널 I/O와 미리 읽기입니다. 프로그램은 일반적으로 개별 문자가 아닌 줄을 통해 사용자와 통신하지만, 전이중 터미널 I/O는 시스템이 다시 입력하는 경우에도 문자가 손실되거나 깨질 염려 없이 사용자가 언제든지 입력할 수 있음을 의미합니다. 미리 읽기를 사용하면 각 행에 대한 응답을 기다릴 필요가 없습니다. 좋은 타이피스트는 문서를 입력할 때 각 줄을 시작하기 전에 잠시 멈춰야 하기 때문에 매우 좌절감을 느낄 것입니다. 자신이 말하고 싶은 내용을 아는 사람이라면 정보를 한 줄씩 입력해야 한다면 고통스러울 것입니다. 최고 속도. 느린 반응은 심리적으로 증폭됩니다.

[인용 끝]

하지만 일부 최신 프로그램은 미리 입력된 콘텐츠를 모두 소진하거나 삭제합니다. ssh그리고apt-get다음은 두 가지 예입니다. 실행 중에 일찍 입력하면 입력의 첫 부분이 사라진 것을 확인할 수 있습니다. 상상할 수 있듯이 이는 문제가 될 수 있습니다.

ssh remotehost do something that takes 20 seconds
mail bob
Dan has retired. Feel free to save any important files and then do
# ssh exits here, discarding the previous 2 lines
rm -fr *
.

답변2

여러분이 볼 수 있는 기본 동작은 입력이 읽힐 때까지 버퍼 어딘가에 있다는 것입니다. (글쎄, 충분히 입력하면 결국 버퍼가 가득 차고 일부 내용이 손실됩니다.많은입력하는 동안). make에 의해 실행되는 대부분의 항목은 STDIN에서 읽히지 않으므로 버퍼에 남아 있습니다.

위험은 잘못된 명령이 입력을 읽는 것입니다. 예를 들어, make호출은 사용자에게 무엇을 묻는 메시지를 표시할지 결정한 후 응답으로 다음 명령을 읽을 수 있습니다. 물론 이것이 얼마나 위험한지는 순서에 따라 다르다. (또한 모든 입력을 먼저 플러시하고 이전 입력을 삭제할 수도 있습니다.)

Makefile에서 일반적으로 사용되는 TeX 명령을 사용하면 이러한 목적을 달성할 수 있습니다. 오류가 발생하면(그리고 사용자에게 메시지를 표시하지 않음 플래그가 제공됨) 진행 방법을 묻는 메시지가 표시됩니다.

더 나은 옵션은 다음을 실행하는 것입니다 make && make check.

답변3

  1. 글쎄요, 분명히, make성공적으로 완료되는 첫 번째 명령(예제에서는)에 의존하는 두 번째 명령을 실행해서는 안 됩니다. 예를 들어 make foo Enter> ./foo Enter 문제가 발생할 수 있습니다. 다음과 같이 입력하는 습관을 들이는 것이 좋습니다 make && make check. 여기서 두 번째 명령은 첫 번째 명령이 성공한 경우에만 실행됩니다.
  2. 이론적으로 첫 번째 명령(프로세스)은 두 번째 명령의 일부를 읽거나 그렇지 않으면 터미널 입력 버퍼에서 이를 제거할 수 있습니다. 처음 6자를 먹으면 make check결국 해당 명령을 실행하게 될 것입니다. 이 명령 heck은 아마도 시스템에 존재하지 않을 것입니다(그러나 뭔가 불쾌한 것일 수도 있습니다). 첫 번째 명령이 여러분이 알고 신뢰하는 온건한 명령이라면 나는 즉시 그 명령에 문제가 있다고 보지 않을 것입니다.
  3. 어떻게/왜 작동하나요? 시스템은 키보드 입력을 버퍼링합니다. 이는 이메일과 비슷합니다. 짧은 시간 내에 누군가에게 5개의 메시지를 보내면 그 사람은 받은 편지함에 앉아서 그 사람이 읽을 때까지 기다립니다. 마찬가지로 첫 번째 명령을 키보드에서 읽지 않는 한, 입력한 명령은 쉘이 읽을 때까지 기다립니다. "typeahead"가 버퍼링할 수 있는 양에는 제한이 있지만 일반적으로 몇 백 자(천자는 아닐 경우)입니다.

관련 정보