cat + 리디렉션을 사용하여 티 시뮬레이션

cat + 리디렉션을 사용하여 티 시뮬레이션

저는 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.outsum 에 씁니다 file2.out.

즉, 거기에는 마법이 없으며 단지 내부적으로 구현되었을 zsh뿐입니다 tee.

관련 정보