명령 출력을 다른 명령으로 파이프하는 방법은 무엇입니까?


83

예:

ls | echo아무것도 인쇄하지 않습니다 (실제로 빈 줄). 파일 목록을 인쇄 할 것으로 예상됩니다.

ls | grep 'foo'반면에, 예상대로 작동합니다 (이름에 'foo'가있는 파일을 인쇄합니다).

이 상황에서 내가하는 일은 다음과 같습니다. ls | while read OUT; do echo $OUT; done그러나 이것은 다소 성가신 일입니다.

파이핑이 일부 명령에서는 작동하지만 다른 명령에서는 작동하지 않는 이유는 무엇입니까? 이 문제를 어떻게 피할 수 있습니까?


2
무엇을 기대 ls | echo하십니까? 왜 단순히 달리지 ls않습니까?
theomega

12
내 요점을 보여주는 가장 간단한 예를 사용했습니다. 객체 저장소 및 해당 유형에 git 객체를 표시하는 단일 라이너를 만들려고 할 때 실제로이 문제가 발생했습니다. 그래서 객체 ID를에 파이프 git cat-file했지만 작동하지 않았습니다. 분명히 echo는 동작이 동일하므로 예제로 사용했습니다.
Mihai Rotaru

또한 xargs에 대한 -n 명령을 살펴보면 하위 명령에 몇 개의 인수를 넣을지를 나타냅니다. `... | xargs -n1 git cat-file`
Rich Homolka

답변:


118

명령 행 인수와 표준 입력에는 차이가 있습니다. 파이프는 한 프로세스의 표준 출력을 다른 프로세스의 표준 입력에 연결합니다. 그래서

ls | echo

ls의 표준 출력을 에코의 표준 입력에 연결합니다. 좋아요? echo는 표준 입력을 무시하고 명령 행 인수 (이 경우에는 없음)를 자체 stdout에 덤프합니다. 출력 : 전혀 없습니다.

이 경우 몇 가지 해결책이 있습니다. 하나는 stdin을 읽고 cat과 같은 stdout에 덤프하는 명령을 사용하는 것입니다.

ls | cat

작업 정의에 따라 '작동'합니다.

그러나 일반적인 경우는 어떻습니까? 실제로 원하는 것은 한 명령의 stdout을 다른 명령의 명령 행 args로 변환하는 것입니다. 다른 사람들이 말했듯 xargs이이 경우 표준 도우미 도구는 stdin에서 명령에 대한 명령 줄 인수를 읽고 실행할 명령을 구성합니다.

ls | xargs echo

대체 명령을 사용하여 이것을 일부 변환 할 수도 있습니다. $()

echo $(ls)

또한 원하는 것을 할 것입니다.

이 두 도구는 모두 쉘 스크립팅의 핵심입니다. 두 가지를 모두 배우십시오.

질문에서 알 수 있듯이 stdin을 명령 줄 args로 변환하는 다른 기본 방법은 쉘의 내장 read명령입니다. "단어"( IFS변수 로 정의 된 단어 )를 임시 변수 로 변환 하여 모든 명령 실행에서 사용할 수 있습니다.


1
유익한 정보 답변, 감사합니다! 나는 현재 배쉬를 배우고 있으며, 전에 xargs와 $ (*) 표기법을 모두 보았지만 그에 많은 관심을 기울이지 않았다. 이제 나는 그들이 얼마나 중요한지 알고 있으며, 그것들을 확실히 살펴볼 것입니다.
Mihai Rotaru

1
xargs는 OP가 찾고 있던 것일 수 있습니다.
Iktys

19

ls | echoecho입력을 읽지 않기 때문에 빈 줄만 인쇄합니다 . 파이프 라인의 마지막 명령은 실제로 echo빈 줄만 인쇄하는 것입니다.

일반적으로:

a | b

의 출력 a이의 입력이되도록합니다 b. 의 Pipelines섹션 을 읽어 보시기 바랍니다 man bash.


정말로 함께 사용 ls하고 싶다면 echo여기에 몇 가지 예가 있습니다.

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done

11

당신이 원하는 경우 명령 시도 :echols

ls | xargs echo

echo출력을 호출 합니다 ls.


3
또는 ls | xargs -I {} echo {}각 회선마다 개별적으로 호출하려면
Alex Abdugafarov

3

단순히 사용하지 않는 이유 :

echo `ls`

또는 훨씬 더 안전한 :

echo "`ls -lrt`"

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