이 경우 이 exec 명령은 어떻게 작동합니까?

이 경우 이 exec 명령은 어떻게 작동합니까?

저는 UNIX 시스템 관리에 관한 교과서를 공부하고 있습니다. Syed Mansoor의 "유닉스 제3판" 3장.

13장에는 다음과 같은 exec 사용법 예제가 있는데, 이는 매우 간단하고 내 기대에 부합합니다.

% /bin/csh
% exec date
Thu Jul 31 18:16:01 PKT 2014

그러나 이 장의 뒷부분에는 다음과 같은 예가 있습니다.

% cat sample
date
echo "Hello, world!"
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!

그러나 이것을 시도하면 다음과 같은 결과를 얻습니다.

$ exec < sample
$ $

오타가 아니고 제가 만든 결과입니다. 여기에 왜 차이가 있는지 이해가 되지 않습니다. 저는 PC-BSD에서 실행하고 있습니다. 이 장의 설명은 이 명령이 현재 쉘의 입력을 stdin에서 파일로 리디렉션한다는 것입니다. 따라서 이 명령을 실행하고 해당 출력을 여전히 셸인 stdout에 인쇄해야 합니다. 나도 시도했다

exec < sample > /dev/tty

(내 생각에는) 온전한 점검으로서 이는 파일을 현재 쉘에 직접 입력하고 내가 사용하고 있는 터미널인 기본 터미널에 출력하는 것을 의미한다고 이해합니다. 그러나 나는 같은 결과를 얻습니다.

마지막으로 이 섹션의 끝에 다음 질문이 나옵니다. 답변은 그의 github에서 찾을 수 있지만 왜 내 시도가 작동하지 않는지 잘 모르겠습니다. 나는 이 솔루션이 왜 작동하는지 이해한다고 생각합니다. 질문:

쉘의 stdin을 data라는 파일로 변경하고 stdout을 out이라는 파일로 변경하는 명령을 작성하세요. 둘 다 현재 작업 디렉터리에 있습니다. 데이터 파일에 다음 줄이 포함되어 있으면 명령을 실행한 후 어떤 일이 발생합니까?

echo –n "The time now is: "
date
echo –n "The users presently logged on are: "
who

내가 시도한 해결책은 다음과 같습니다.

$ exec < data > out

내가 이해하는 것은 파일을 data셸의 입력으로 지정하고 셸의 출력을 파일로 직접 지정하는 것 out 입니다 .

( exec > out ; exec ./data )

나는 이것을 서브셸에서 실행되고 먼저 해당 서브셸의 출력을 file 로 지정한 out다음 data해당 서브셸을 출력이 해당 파일로 리디렉션된 실행 파일로 바꾸는 그룹화된 명령으로 이해합니다.out

그래서 내 질문은 다음과 같습니다

  • 교과서의 두 번째 예가 내 컴퓨터에서 작동하는 이유는 무엇입니까? 작성자의 PC-BSD 버전은 아마도 9년 이전 버전일지라도 동일한 시스템의 ISO가 사용됩니다. 나는 이 교과서를 위해서만 이 가상 머신을 사용합니다.
  • 운동 솔루션이 작동하지 않는 이유는 무엇인가요?
  • 저자의 솔루션을 올바르게 이해하고 있습니까?

당신의 배려에 감사합니다. PS 저는 chmod u+x이 예제의 모든 실행 파일을 실행했습니다.

댓글 작성자의 요청에 따라 수정됨 다음은 교과서 예제에 대한 시도입니다. 시작부터 끝까지입니다. 가상머신이라 정확히 복사+붙여넣기는 못하는데 한 글자씩 정확하게 입력하고 출력했는데 세 번 확인하니 오류 없이 잘 됩니다.

[tony@pcbsd-8682] ~/ch12% cat > sample
date
echo "Hello, world!"
[tony@pcbsd-8682] ~/ch12% /bin/sh
$ exec < sample
$ [tony@pcbsd-8682] ~/ch12% file sample
sample: ASCII text

연습용:

[tony@pcbsd-8682] ~/ch12/13.4d-redux% cat data
echo -n "The time now is: "
date
echo -n "The users presently logged on are: "
who
[tony@pcbsd-8682] ~/ch12/13.4d-redux% file data
date: ASCII text
[tony@pcbsd-8682] ~/ch12/13.4d-redux% /bin/sh
$ exec < data > out
$ [tony@pcbsd-8682] ~/ch12/13.4d-redux%

답변1

교과서의 대본에 오류가 있다고 말하고 싶습니다. 스크립트를 다음과 같이 변경했는데 작동했습니다.

% cat > sample
date
echo "Hello, world!"
# Press Ctrl-D (End Of File) here to stop entering data into file sample
% /bin/sh
% exec < sample
Thu Jul 31 18:41:38 PKT 2014
Hello, world!

두 번째 질문에 관해서는 이 문제가 정확히 무엇을 요구하는지 완전히 이해하지 못하지만 귀하와 교과서에서 제공한 솔루션을 시도했습니다. 둘 다 데이터에서 명령 실행 결과를 출력 파일에 기록합니다. 그래서 나는 둘 다 옳다고 말하고 싶습니다.

관련 정보