파이프를 사용하여 두 개의 인수를 명령에 전달 주장을 전달할 수있는

일반적으로 우리는 하나의 인수 만 전달하면됩니다.

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file

두 가지 주장을 전달할 수있는 방법이 있습니까? 같은 것

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`

두 결과를 파일에 먼저 저장할 수 있습니다.

echo abc > file1
echo xyz > file2
cat file1 file2

그러나 실수로 파일을 덮어 쓸 수 있습니다. 이것은 비 대화식 스크립트로 들어갑니다. 기본적으로 두 개의 임의 명령 결과를 cat파일에 쓰지 않고 전달할 수있는 방법이 필요 합니다.


업데이트 : 죄송합니다.이 예는 문제를 숨 깁니다. { echo abc ; echo xyz ; } | cat작동 하는 것처럼 보이지만 출력은 echos가 아닌 s 로 인해 발생 합니다 cat.

더 좋은 예는 { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,예상대로 작동하지 않는 것입니다.

file1:
a,b
c,d

file2:
1,2
3,4

예상되는 결과는 다음과 같습니다.

b,1
d,3

해결 :

프로세스 대체 사용 :cat <(command1) <(command2)

또는 다음을 사용하여 명명 된 파이프를 만드십시오 mkfifo.

mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2

temp1과 temp2가 미리 존재하지 않는 한 덜 우아하고 더 장황하지만 잘 작동합니다.



답변

‘프로세스 대체’ http://tldp.org/LDP/abs/html/process-sub.html 을 원한다고 생각합니다 . 더 많은 옵션이 있고 구문이 다를 수 있지만 zsh에서도 작동합니다.

/dev/fd/something대체 할 때마다 의사 파일 ( )을 만듭니다 . 꽤 유용합니다. 이 명령은 스트림으로 만 읽을 수 있으므로 fseek를 사용하여 앞뒤로 이동할 수 없습니다. 파이프처럼 바이트 스트림으로 읽어야합니다.

귀하의 예제는 프로세스 대체로 작동합니다.

cat <(echo abc) <(echo xyz)
paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2)

프로세스를 사용하는 도구로 생각하고 임시 파일이없는 파일 인 것처럼 가장하십시오.

( 이전 답변에서 )


답변

파이프 연산자는 그룹화 된 명령의 표준 출력을 세 번째의 표준 입력에 연결하기 때문에 중괄호가 실제로 작동했습니다.

표준 입력을 사용하지 않는 명령을 실행하여 출력이 에코에서 출력되지 않는다고 알 수 있습니다. 예를 들어 { echo 1; echo 2;} | echo 31 \ n2 \ n3이 아닌 3을 인쇄합니다.

그러나 중괄호의 두 명령 cat이 결과를 출력하는 것과 동일한 출력에 쓰므로 원하는 것은 아닙니다 . 와 같은 명령에 대한 두 개의 인수로 사용할 두 개의 다른 결과를 생성하려면 paste임시 파일 또는 명명 된 파이프를 사용해야합니다.

mktemp고유 한 임시 파일 mkfifo을 생성하거나 FIFO 파이프 파일 을 생성하는 데 사용할 수 있습니다 .


답변

나는 xargs를 좋아한다. 예를 들어 / usr / local에서 모든 mysql 데이터 디렉토리의 크기를 찾고 싶다.

osx : 로컬 사용자 $ 암호
/ usr / local
osx : 로컬 사용자 $ ls | grep mysql
MySQL
mysql-5.0.51a-osx10.5-x86_64
mysql-5.0.51b-osx10.5-x86_64
mysql-5.1.39-osx10.5-x86_64
mysql-5.6.17-osx10.7-x86_64
os x : 로컬 사용자 $ ls | grep mysql | sudo xargs du -sh
4.0K MySQL
2.8G mysql-5.0.51a-osx10.5-x86_64
 10G mysql-5.0.51b-osx10.5-x86_64
 25G mysql-5.1.39-osx10.5-x86_64
753M mysql-5.6.17-osx10.7-x86_64
osx : 로컬 사용자 $

xargs


답변