일반적으로 우리는 하나의 인수 만 전달하면됩니다.
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
작동 하는 것처럼 보이지만 출력은 echo
s가 아닌 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 3
1 \ 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 : 로컬 사용자 $