2011-02-14 4 views
4

내가 할 zsh을위한 능력을 알고 있어요. 예를 들어, mysqldump을 두 번 실행하지 않으려면이 두 명령을 어떻게 결합해야합니까?파이프 표준 출력은 [zsh을]

mysqldump db1 >db1.sql | mysql db2 
bzip2 db1.sql 

그러나 나는 오히려 비 압축 파일을 디스크에 기록 할 것 :

mysqldump db1 | bzip2 > db1.sql.bz2 
mysqldump db1 | mysql db2 

내가 가지고 올 수있는 가장 가까운입니다 (이 크다!).

답변

4

다음 작품 :

echo abc > >(gzip > 1) > >(xz > 2) 

귀하의 예를 들어 수정 (하지만 검증되지 않은) : 아마

mysqldump db1 > >(bzip2 > db1.sql.bz2) > >(mysql db2) 

또는 더 나은 :

{ mysqldump db1 } > >(bzip2 > db1.sql.bz2) > >(mysql db2) 

// PROCESS SUBST에서 거의 같은 예제를 발견했습니다. man zshexpn에 ITUTION 부 : 쉘 대신 구현의 FIFO의 파이프를 사용

paste <(cut -f1 file1) <(cut -f3 file2) \ 
    > >(process1) > >(process2) 

:

는 또한 이전 예보다 컴팩트하고 효율적으로 기록 될 수 있다는 것을 유의으로합니다 (MULTIOS 옵션이 설정되어 제공) 위의 예에서 후자의 두 프로세스 대체.

> (프로세스)에 추가 문제가 있습니다. 이것이 외부 명령에 첨부 될 때, 상위 쉘은 프로세스가 완료 될 때까지 기다리지 않으므로 바로 다음 명령은 완료되는 결과에 의존 할 수 없습니다. 문제와 해결책은 zshmisc (1)의 MULTIOS 절에서 설명한 것과 같습니다. 따라서 위 예제의 단순화 된 버전에서 :

paste <(cut -f1 file1) <(cut -f3 file2) > >(process) 

(참고로 MULTIOS는 포함되지 않음) 프로세스는 비동기 적으로 실행됩니다. 해결 방법은 다음과 같습니다.

여기에있는 추가 프로세스는 완료 될 때까지 대기하는 부모 셸에서 생성됩니다.

1

fifo의 프로세스를 통해 tee 유틸리티를 사용하여 표준 출력을 각 FIFO 및 표준 출력으로 복사 할 수 있습니다. 뭔가 같은 :

mkfifo db1.sql 
bzip2 db1.sql & 
mysqldump db1 | tee db1.sql | mysql db2 
5

프로세스 대체를 사용할 수 있습니다. zsh을에서

:

ls -1 > >(grep foo) > >(grep bar) 

배쉬 :

ls -1 | tee >(grep foo) >(grep bar) >/dev/null 

프로세스 대체 당신을 위해 명명 된 파이프를 관리합니다.

+0

+1 - @ ZyX는 더 완벽한 답변이기 때문에 허용되었습니다. 명령을 완료하기를 기다리는 문제를 해결합니다.하지만 zsh에 항상 있지는 않기 때문에 티와 함께 ​​bash를 사용하는 옵션을 좋아합니다. 감사! – wuputah