일부 웹사이트에서 가져온 스크립트가 있습니다. 실행하면 "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
시작합니다 . 그런 다음 나머지 파일의 출력이 해당 명명된 파이프로 전송되도록 예약합니다. 또한 완료 시 명명된 파이프가 삭제되도록 준비합니다.tee
demo
some other prog
log
demo
exec 1>&-
이 줄은 필수가 아닙니다.
이 모든 것의 최종 결과는 "log" 파일에 "goodbye"라는 단어를 쓰는 것입니다. 실행하시면 demo | cat
화면에 "Hello"와 "Bye"가 보일 겁니다.
@derobert가 주석에서 지적했듯이 명명된 파이프는 예측 가능한 이름을 갖습니다. 이 설정에 따라 누군가가 출력을 읽거나(따라서 보지 못함) 추가 콘텐츠를 추가하여 복사하여 출력을 손상시킬 수 있습니다 umask
. 이는 알려졌거나 예측 가능한 이름에 대해 사용할 수 있는 많은 표준 공격에 추가됩니다. 다른 파일이 열리거나 잘리도록 소프트 또는 하드 링크를 미리 설정할 수 있습니다. 내 Linux 시스템에서는 파일이 이미 있으면 mknod가 실패하지만 스크립트는 이 오류를 무시하므로 파일이 실행됩니다.demo
tee
tee
exec 1>$npipe