
저는 bash 리디렉션을 배우고 있는데 리디렉션을 사용하여 tee 명령을 에뮬레이션하는 방법이 있는지 궁금합니다. 그게 가능합니까? 아니면 다른 방법이 있을 수도 있습니다.
tee에 대해 질문하기 전에 저는 bash 표현식을 사용하여 스트림을 두 개의 동일한 스트림으로 분할할 수 있는 가능성을 찾고 있었습니다. 그러나 이것은 불가능해 보인다.
답변1
다음은 파일에 파일이 포함되어 있지 않다고 가정 tee
하고 동일한 작업을 수행하는 bash 함수 입니다 (이 문자열을 원하는 대로 조정하여 파일에 포함되지 않을 가능성이 매우 낮도록 할 수 있습니다).tee -a
¤¤¤¤¤¤¤¤¤¤!
tee(){
[ "$1" = '-a' ] && shift || rm -f "$1"
sed 's/\x0/¤¤¤¤¤¤¤¤¤¤!/g' - | while read line; do
echo "$line" | sed 's/¤¤¤¤¤¤¤¤¤¤!/\x0/g' >> "$1"
done
}
bash와 zsh를 사용하여 테스트했습니다.
사용 예:
echo asdf | tee -a file
답변2
Bash에서는 리디렉션을 사용하여 이 작업을 수행할 수 없지만 다음과 같이 할 수 있습니다.
$ cat file1
europe|EU
australia|AU
china|CN
$ cat file1 | { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; }
europe|EU
australia|AU
china|CN
$ cat teetest
europe|EU
australia|AU
china|CN
선택하다:
$ { IFS=$'\n' read -r -d '' -a a; printf '%s\n' "${a[@]}"; printf '%s\n' "${a[@]}" >teetest; } <file1
또는 다음과 같이 함수를 작성할 수 있습니다.
$ function teetest { v="$(</dev/stdin)";printf '%s\n' "$v";printf '%s\n' "$v">teetest; }
$ cat file1 |teetest
europe|EU
australia|AU
china|CN
$ cat teetest
europe|EU
australia|AU
china|CN
답변3
와 함께 zsh
, 예, 아니오와 함께 bash
.
그리고 zsh
:
cat file.in > file1.out > file2.out
심지어:
< file.in > file1.out > file2.out
또는 중괄호 확장을 사용하여 출력 파일을 생성합니다.
< file.in > file{1..2}.out
(실행 $NULLCMD
: cat
기본값)
콘텐츠 작성에 사용되는 표준 출력 은 cat
하나만 있습니다 file.in
. 위에서 cat
표준 출력은 파이프입니다. 그리고 zsh
다른 쪽 끝의 출력을 읽고 이를 file1.out
sum 에 씁니다 file2.out
.
즉, 거기에는 마법이 없으며 단지 내부적으로 구현되었을 zsh
뿐입니다 tee
.