Bash에서 입력이 파이프로 전송되는 방법 이해


17

파이프가 bash에서 어떻게 작동하는지 이해하지 못합니다.

한 명령의 출력을 다른 명령의 입력으로 사용한다는 것을 알고 있습니다.

명령이 화면에 인쇄되기 때문에 출력을 얻을 수 있습니다.

그러나 명령에 어떤 입력이 필요한지 어떻게 알 수 있습니까?

다음은 효과가 있다고 생각한 예입니다.

which gem | rm

불행히도 그렇지 않았습니다.

어떤 보석이 출력되어 /usr/bin/gem출력이 맞아야합니까?

나는 그것이 rm에게 주어 졌다고 생각했기 때문에 rm /usr/bin/gem나는 그것이 잘못되었습니다.

내 질문은 명령에 어떤 입력이 필요한지 어떻게 알 수 있습니까?


2
외에 다른 어떤에서, rm /usr/bin/gemA는 끔찍한 생각. 그 남기기 gem(그리고 루비가 함께가는 인터프리터) 혼자 원하는 루비 인터프리터를 설치 (및 gem사용) rvm: rvm.beginrescueend.com
텔레 마쿠스를

답변:


23

"입력"과 "명령 줄 인수"는 다릅니다.

rm 인수로 제공된 파일을 제거합니다.

파이프는 왼쪽 명령의 출력을 오른쪽 명령의 입력으로 리디렉션합니다. 오른쪽에있는 프로그램의 명령 행 인수에는 영향을 미치지 않습니다.

수행하려는 작업을 수행 xargs하려면 표준 입력을 명령 실행 인수로 변환하여 프로그램을 실행하십시오. 그게 직업입니다.

which gem | xargs rm예를 들어 gemPATH에서 를 제거합니다 .


12

rm입력하지 않고 인수를받습니다. 이것들은 다릅니다. 인수는 명령 행의 프로그램에 작동에 영향을주는 스위치 및 파일 이름 등입니다. 입력은 프로그램이 작동하는 데이터입니다. 예를 들어 grep입력과 인수를 모두 사용합니다.

grep "foo" file.txt

두 가지 주장이있다 "foo"file.txt. 입력 은 IS 내용file.txt아닌 문자열 file.txt자체. grep이 입력을 받으므로 파이프와 함께 사용할 수 있습니다.

cat file.txt | grep "foo"

cat이 file.txt인수로 사용하고 출력 내용 을 생성하므로 동일한 출력을 생성합니다 file.txt. 그런 다음 그 출력은 grep에 파이프되어 첫 번째 예제에서와 같이 grep이 파일 자체를 여는 것과 동일한 효과를줍니다.

한 프로그램의 출력을 다른 프로그램의 인수 로 사용하려면 백틱을 사용하십시오.

rm `which gem`

또는이 대안 (bash 특정) 구문 :

rm $(which gem)

편집 : 또는 xargs다른 응답자가 지적한대로. 커맨드 라인으로 고양이를 껍질을 벗기는 많은 방법.


그 지적이의 가치 cat file.txt | grep "foo"보다 느린 시간이 될 수 수백 grep "foo" file.txt.
Borealid

1
이것은 내가 얻지 못하는 부분입니다. 인수가 무엇이고 표준 입력이 무엇인지 어떻게 알 수 있습니까?
ajsie

8
@ajsie : 프로그램 이름 뒤에 입력하고 Enter 키를 누르기 전에 입력하면 인수입니다. 실행이 시작된 후 프로그램에 입력하면 표준 입력입니다.
Borealid

1
알았다! 이것은 모든 것을 설명했다. 이제 명령을 직접 사용할 수 있고 프롬프트가 표시되는지 확인하고 (grep) 매뉴얼 (man grep)을 읽고 std 입력을 사용하는지 확인할 수 있습니다.
ajsie

@ajsie : 맨 페이지로 들어가고 싶지 않은 경우 grep --help수용되는 인수에 대한 간략한 개요 도 있습니다 .
Borealid

3

man관심있는 명령 페이지를 확인하십시오 .이 프로그램은 읽은 것으로 표시합니다 stdin( man grepstdin을 읽는 인기있는 명령을 시도하십시오 ).


나는 시도 man grep | grep 'standard input'하고있어 If no file arguments are specified, the standard input is used.마지막 경기를한다. 👍 나는 grep그것의 약의 약간의 맛 을 주어야 했다. 😎
ma11hew28

2

PATH에 공백이 포함 된 디렉토리가 있거나 명령 이름에 공백이 포함 된 경우에는 모두 위험합니다.

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

GNU Parallel http://www.gnu.org/software/parallel/에는 그러한 문제가 없으므로 PATH에 공백이 포함 된 디렉토리가 있거나 명령 이름에 공백이 포함 된 경우에도 작동합니다.

which gem | parallel rm
parallel -a <(which bass) rm

GNU Parallel에 대한 소개 비디오를 시청하십시오. http://www.youtube.com/watch?v=OpaiGYxkSuQ

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