exec, Trap, mknod, tee의 기능에 대해 설명해주세요. [닫기]

exec, Trap, mknod, tee의 기능에 대해 설명해주세요. [닫기]

일부 웹사이트에서 가져온 스크립트가 있습니다. 실행하면 "Hello"가 출력되지만 스크립트가 어떻게 작동하는지 이해할 수 없습니다.

이 스크립트가 실제로 무엇을 하는지 설명할 수 있는 사람이 있나요?

#!/bin/bash

echo hello

if test -t 1; then
  # Stdout is a terminal.
  exec >log
else
  # Stdout is not a terminal.
  npipe=/tmp/$$.tmp
  trap "rm -f $npipe" EXIT
  mknod $npipe p
  tee <$npipe log &
  exec 1>&-
  exec 1>$npipe
fi

echo goodbye

답변1

이 스크립트는 더 많은 작업을 수행하기 위해 변경해야 하는 예일 수 있습니다 echo goodbye.

스크립트 demo를 실행하면 보시다시피 먼저 "hello"가 출력됩니다. 그런 다음 실행 중인지 결정하기 위해 출력이 터미널로 전송되는지 확인합니다.

demo

또는

demo | some other program

전자인 경우 나머지 파일의 출력을 명명된 파이프로 보냅니다 log. 후자인 경우 명명된 파이프에 기록된 모든 내용을 스크립트의 출력으로 복사하는 프로세스를 named pipe시작합니다 . 그런 다음 나머지 파일의 출력이 해당 명명된 파이프로 전송되도록 예약합니다. 또한 완료 시 명명된 파이프가 삭제되도록 준비합니다.teedemosome other proglogdemo

exec 1>&-이 줄은 필수가 아닙니다.

이 모든 것의 최종 결과는 "log" 파일에 "goodbye"라는 단어를 쓰는 것입니다. 실행하시면 demo | cat화면에 "Hello"와 "Bye"가 보일 겁니다.

@derobert가 주석에서 지적했듯이 명명된 파이프는 예측 가능한 이름을 갖습니다. 이 설정에 따라 누군가가 출력을 읽거나(따라서 보지 못함) 추가 콘텐츠를 추가하여 복사하여 출력을 손상시킬 수 있습니다 umask. 이는 알려졌거나 예측 가능한 이름에 대해 사용할 수 있는 많은 표준 공격에 추가됩니다. 다른 파일이 열리거나 잘리도록 소프트 또는 하드 링크를 미리 설정할 수 있습니다. 내 Linux 시스템에서는 파일이 이미 있으면 mknod가 실패하지만 스크립트는 이 오류를 무시하므로 파일이 실행됩니다.demoteeteeexec 1>$npipe

관련 정보