파이프를 사용하여 두 개의 인수를 명령에 전달


22

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

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가 미리 존재하지 않는 한 덜 우아하고 더 장황하지만 잘 작동합니다.


1
이로 인해 머리가 긁 힙니다. 두 개의 다른 명령을 단일 고양이에게 파이프하고 싶습니까?
user606723

2
"파이핑 (piping)"과 "인수 (arguments)"는 완전히 관련이없는 두 개념이라는 것을 알고 있습니까?
Ignacio Vazquez-Abrams

@Ignacio err ... 나는 리눅스에 익숙하지 않아서 그 차이를 모른다. 나는 항상 파이핑이 이전 결과를 논쟁으로 생각한다는 것을 생각했습니다. 깨달을 까?
goweon

@firebat 아니오, 파이프는 이전 명령의 표준 출력을 다음 명령의 표준 입력으로 사용하는 것을 의미합니다. 당신은 여전히 ​​다른 개념 인 논쟁을 가질 수 있습니다.
Rich Homolka

또한 업데이트 텍스트에 이르기까지 출력은 cat에서 나 왔으며 명령문은 cat과 별개로 보이지만 한 스트림으로 직렬화되므로 수행 할 수 없습니다.
Rich Homolka

답변:


17

'프로세스 대체' 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)

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

( 이전 답변에서 )


2

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

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

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

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


귀하의 답변에 크게 감사드립니다.이 솔루션에 대해 며칠 동안 검색하여 마침내 귀하의 답변을 찾았습니다.
Saeed Falsafin

2

나는 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.