(완전성을 위해)
하지만 @의 enzotib의 대답은 대부분의 아마 당신이 원하는, 그것은 당신이 무엇을 요구하지 않습니다. [ -t 1 ]
파일 디스크립터가 터미널 장치인지 확인합니다. 파이프 이외의 것이 아닙니다 (일반 파일, 소켓, 다른 유형의 장치와 같은 /dev/null
...)
이 [
명령에는 -t
파이프에만 해당하는 것이 없습니다 . 파일 디스크립터와 연관된 파일 유형을 얻으려면 해당 파일에 대한 fstat()
시스템 호출 을 수행해야 합니다. 이를위한 표준 명령은 없지만 일부 시스템이나 쉘에는 일부가 있습니다.
GNU로 stat
:
grep() {
if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
[ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
command grep "$@"
else
command grep -n "$@"
fi
}
또는 zsh
자체 stat
내장 (GNU의 몇 년 전부터 존재)은 다음과 같이로드 zstat
됩니다.
grep() {
zmodload -F zsh/stat b:zstat
local stdin_type stdout_type
if zstat -A stdin_type -s -f 0 +mode &&
zstat -A stdout_type -s -f 1 +mode &&
[[ $stdin_type = p* || $stdout_type = p* ]]
then
command grep "$@"
else
command grep -n "$@"
fi
}
이제 몇 가지 메모 :
파이프 를 사용하는 것은 셸 파이프 라인 만이 아닙니다 .
var=$(grep foo bar)
또는:
cmd <(grep foo bar)
또는:
coproc grep foo bar
또한 grep
stdout이 파이프로 이동하여 실행 합니다.
쉘이 ksh93
인 경우 일부 시스템에서는 파이프 라인의 파이프 대신 소켓 쌍을 사용합니다.
[[ -t 0 && -t 1 ]]
표준 입력과 표준 출력이 모두 터미널에 연결되어 있으면 줄 번호 만 원하면 테스트 하십시오.