태그 보관물: tee

tee

‘티’의 목적은 무엇입니까? 작업을 수행 할 수 있습니다

tee내가 본 모든 사용법 은 다음과 같습니다.

 do_something | tee -a logfile

또는:

do_something_else | tee logfile

가요 tee당신은 쉘 파이프 리디렉션과 같은 작업을 수행 할 수 있습니다 모르는 사람들을 위해 발명? 같은 :

do_something >> logfile

또는:

do_something_else > logfile

실제로 동일하며 입력하는 데 적은 키보드 적중이 필요합니다. 어떤 숨겨진 기능이 보이지 tee않습니까?



답변

여러분이 보지 않는 것은 즉 do_something | tee -a logfile로 출력을두고 logfile 하고 있는 동안, 표준 출력에 do_something >> logfile넣는다 에만 로그 파일에.

tee‘T’교차와 마찬가지로 단일 입력, 다중 출력 시나리오를 생성하는 것이 목적입니다 .

편집하다

tee보다 겉보기 사용을 가능하게 하는 방법에 대한 의견이 있습니다 sudo. 이 점 옆에 : cat, dd또는 어쩌면 더 나은 buffer당신이 다중 출력을 필요로하지 않는 경우에, 더 나은 성능이 가능성을 제공합니다. 사용 tee하지는 “도 할 수있는”무엇을 위해, 그것은 설계 무엇을


답변

Tee 쓸모 없다

어쨌든 당신은 그것을 알고 있었습니까? 그렇지 않다면 계속 읽으십시오! 또는 그것이 어떻게 작동하는지 알고 있지만 그것이 존재 하는지 확실하지 않다면 , 유닉스 철학과 어떻게 조화를 이루는 지 끝까지 건너 뛰십시오.

무엇 이다 의 목적 tee?

가장 간단한 방법으로 표준 입력의 데이터를 가져 와서 표준 출력과 하나 이상의 파일에 씁니다. 하나의 입력을 두 개의 출력 (및 두 방향)으로 나누는 방식으로 배관 티 피스 에 비유되었습니다 .

첫 번째 예를 보자.

do_something | tee -a logfile

그러면 출력을 가져 와서 do_something로그 파일에 추가하는 동시에 사용자에게 표시합니다. 실제로 Wikipedia 페이지tee 의 두 번째 예는 다음과 같습니다.

명령의 출력을보고 기존 파일에 추가하려면 다음을 수행하십시오.

  lint program.c | tee -a program.lint

그러면 컴퓨터에 lint program.c 명령의 표준 출력이 표시되며 동시에 program.lint 파일의 끝에 사본이 추가됩니다. program.lint 파일이 없으면 작성됩니다.

바로 다음 예제는 다른 용도가 : 권한의 단계적 확대를 :

권한 에스컬레이션을 허용하려면 다음을 수행하십시오.

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

이 예는 sudo명령에 내재 된 한계를 우회하는 데 사용되는 티를 보여줍니다 . sudo표준 출력을 파일로 파이프 할 수 없습니다. 표준 출력 스트림을로 덤프함으로써 /dev/null콘솔에서 미러링 된 출력도 억제합니다. 위의 명령은 사용자의 공개 키를 서버의 키 인증 목록에 설치하여 ssh를 통해 서버에 대한 현재 사용자 루트 액세스 권한을 제공합니다.

또는 한 명령의 출력을 가져 와서 어딘가에 쓰고 다른 명령의 입력으로 사용하고 싶습니까?

tee 명령을 사용하여 명령 출력을 파일에 저장하고 입력과 동일한 출력을 다른 명령으로 리디렉션 할 수 있습니다.

다음 명령은 crontab 항목의 백업을 수행하고 crontab 항목을 sed 명령의 입력으로 전달하여 대체를 수행합니다. 대체 후 새 cron 작업으로 추가됩니다.

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

( Tee 명령 사용 예에 대한 신용 )

Tee 유닉스 철학과 함께 작동합니다.

한 가지 일을 잘 수행하는 프로그램을 작성하십시오. 함께 일할 프로그램을 작성하십시오. 범용 인터페이스이므로 텍스트 스트림을 처리하는 프로그램을 작성하십시오.

( 유닉스 철학의 기본에 대한 학점 )

tee 이 모든 것에 맞습니다 :

  • 그것은 한 가지 일을합니다 : 여분의 입력 사본을 만듭니다.
  • 다른 프로그램과 함께 작동하므로 위의 예와 같이 다른 프로그램을 함께 사용할 수 있습니다.
  • 표준 입력에서 주어진 텍스트 스트림을 조작하여이를 수행합니다.

답변

실제로 동일하며 입력하는 데 적은 키보드 적중이 필요합니다.

전혀 같지 않습니다 …

다음은 다소 동등한 것으로 보이지만 그렇지 않습니다.

$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi

중요한 차이점은 전자는 이름 지정된 파일에만 데이터를 기록하고 후자는 hi터미널 ( stdout) 명명 된 파일에 다음과 같이 기록한 것입니다.


tee당신이 파일에 데이터를 기록 할 수 있도록 하고 유용한 일을하는 것을 허용 할 이후 파이프 라인에서 사용 – 파이프 라인 도중에에서 데이터를 유지하는 같은 :

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

또는 전체 파이프 라인에 상승 된 권한을 부여하지 않고 상승 된 권한으로 파일에 쓸 수 있습니다 (여기서는 echo사용자로 실행되지만 tee파일에으로 기록 root).

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

을 사용하면 tee많은 파일 ( stdout )에 쓸 수 있습니다 .

echo "hi" \
  | tee a.txt b.txt

exec와 함께 사용 하여 tee모든 스크립트의 출력을 파일에 기록하는 동시에 관찰자 ( stdout)가 데이터를 볼 수 있도록 허용 할 수 있습니다.

exec > >( tee output.log )

답변

이것은 티입니다.

T 자형 파이프 피팅. 입구와 두 개의 별도 콘센트가 있습니다.
즉, 하나의 파이프를 두 개의 파이프로 분할합니다. 도로의 포크처럼.

마찬가지로 표준 입력을 두 개의 개별 출력으로 리디렉션 할 수 tee있는 파이프 ( |)입니다.



예를 들어 말, 당신은 입력합니다 ls /.
다음과 같은 출력이 나타납니다.

Applications    Network     Users       bin        dev      net      private    tmp         var
Library         System      Volumes     cores      etc      home     opt        sbin        usr

출력을 텍스트 파일로 리디렉션하면 ls / > ls.txt결과 텍스트 파일에만 셸에 출력이 표시되지 않습니다.

출력을보고 동시에 텍스트 파일로 전달하고 싶습니까? 파이프에을
추가 tee하십시오 ( |) :ls / | tee ls.txt


두 가지를 비교하십시오.

ls /          >          ls.txt
ls /        | tee        ls.txt

답변

아니요 . >>>연산자를 사용하여 실제로 파일로 리디렉션 할 수있는 몇 가지 예 중 하나를 언급했습니다 .

그러나 티는 훨씬 더 많은 일을 할 수 있습니다. 파이프로 파이프하기 때문에 다른 파이프로 파이프 할 수 있습니다.

wikipedia 페이지 에 좋은 예가 있습니다 .

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

기본적으로 Tee로 파이프 할 수 있으므로 Tee에서 다른 것으로 파이프 할 수 있습니다. 로그 파일을 작성하는 것만으로도 Tee가 필요하지 않습니다.


답변

tee쓸모가 없습니다. 나는 그것을 항상 사용하고 그것이 존재하기 때문에 기쁘다. 분할하려는 파이프 라인이있는 경우 매우 유용한 도구입니다. 아주 간단한 예는 $dtar를 원하는 디렉토리 가 있고 편집증 (내와 같은)이고 데이터를 안정적으로 보유하기 위해 저장 매체를 신뢰하지 않기 때문에 디렉토리 를 해시하려는 것입니다. 당신은 할 수 먼저 디스크에 기록하고이를 해시하지만,이 해시되기 전에 아카이브가 손상되면 경우 그 실패 할 것입니다. 또한, 당신은 그것을 읽어야 할 것입니다. 그리고 수백 GB 크기의 파일을 많이 사용한다면, 다시 읽을 필요가 없다면 다시 읽고 싶지 않다는 것을 알게 될 것입니다.

그래서 내가하는 일은 단순히 이것입니다 :

tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null

타르 볼을 생성하고 티로 파이프 한 다음 두 개의 서브 쉘로 파이프하고, 그 중 하나는 해시되고 다른 하나는 디스크에 기록됩니다.

큰 파일에 대해 여러 작업을 수행하려는 경우에도 좋습니다.

< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null

파일을 한 번 읽고 해시하여 (필요한지 여부를 확인할 수 있음) 추출한 후 다른 위치로 복사합니다. 이를 위해 세 번 읽을 필요가 없습니다.


답변

@bertieb의 대답에 대한 Nitpick 이 예제는 sudo 명령의 고유 제한을 무시하는 데 사용되는 티를 보여줍니다. sudo는 표준 출력을 파일로 파이프 할 수 없습니다.

고유 한 제한은 없으며 명령 처리 방법에 대한 오해 만 있습니다.

예:

sudo echo 0 > /proc/sys/net/ipv4/ip_forward

현재 쉘은 명령 줄을 구문 분석합니다. 출력 리디렉션을 찾아서 수행합니다. 그런 다음 명령을 실행하고 sudo나머지 명령 줄은 실행 된 명령에 대한 인수로 제공합니다. 현재 셸에 루트 권한이 없으면 출력 리디렉션이 실패합니다.

echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward

이것은 출력 리디렉션이 tee명령으로 지연되기 때문에 작동합니다 .이 시점에서을 통해 실행 되었기 때문에 루트 권한이 있습니다 sudo.

sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

리디렉션을 수행하는 셸에 루트 권한이 있기 때문에 작동합니다.