저는 Unix를 처음 접했고 파이프가 어떻게 작동하는지 이해하려고 노력하고 있습니다. 나는 그것을 얻었다고 생각하여 다음 예제를 시도했지만 성공하지 못했습니다.
(base) MacBook-Pro:Code usr$ echo "file.txt ~/.Trash" | mv
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
무엇이 문제인지 알고 싶습니다.
고마워요, 다니엘
답변1
ㅏ관로연결하다표준 출력왼쪽 프로세스의 표준 입력은 오른쪽 프로세스의 표준 입력으로 전달됩니다. 표준 출력 echo "file.txt ~/.Trash"
에 기록하면 file.txt ~/.Trash
파이프는 문자열을 mv
읽을 수 있도록 만듭니다.
그러나 mv
이 시점에서는 표준 입력에서 읽지 않습니다. 인용한 오류 메시지에서 알 수 있듯이 대신 최소한 두 개의 명령줄 인수(하나 source
와 하나 target
또는 하나 이상의 source
s와 하나) 를 수신할 것으로 예상합니다 directory
. 아무 것도 표시되지 않는다고 불평합니다
( mv
예를 들어 run 과 같이 필요에 따라 호출하더라도 표준 입력을 읽지 않습니다 echo foo | mv source dest
. 확인 메시지가 표시되는 경우와 같이 사용자와 상호 작용해야 할 때만 표준 입력을 사용합니다).
실제로 모든 프로그램이 표준 입력을 읽는 것은 아닙니다. 일부 프로그램에서 표준 스트림을 사용하는 방법은 man
실제 페이지에 설명되어 있습니다. 그것들POSIX 유틸리티"STDIN", "STDOUT" 및 "STDERR" 전용 섹션이 있는 반면, 다른 버전은 덜 공식적으로 구성되어 있어 전체 내용을 읽어야 할 수도 있습니다.
프로그램이 표준 스트림을 사용하는 방법에 대한 규칙은 없습니다. 질문에 대한 답변에서 언급했듯이제안된 중복 대상, 주로 프로그램의 의미와 관련이 있습니다. 조금 단순화하기 위해 데이터 스트림을 처리하는 프로그램은 표준 입력/출력을 사용하는 경향이 있는 반면, 운영 체제 개체(파일, 디렉터리, 프로세스, 사용자...)를 처리하는 프로그램은 명령줄 인수만 사용하는 경향이 있습니다.
마지막으로 귀하의 질문이 제기하는 특정 문제에 도달했습니다. 표준 입력에서 읽는 *nix 유틸리티의 하위 집합만 이를 사용하여 읽습니다.주문하다. 대체로 말하면 인터프리터만 있습니다. 주로 쉘(표준 sh
, bash
, zsh
...) 및 텍스트 처리 지향 유틸리티(텍스트 처리에만 국한되지는 않지만, 예: awk
, grep
, sed
...)뿐만 아니라 계산기( bc
) 및 물론 지금 당장은 생각나지 않는 다른 것들도 있습니다.
*nix 시스템을 관리하도록 설계된 대부분의 도구 mv
는 문자열을 고유한 요소로 구문 분석하도록 설계되지 않았습니다. 일반적인 작업 분할에서 이 역할은 셸의 역할이며, mv
개별 의미가 잘 정의된 특정 작업(인수 기반)을 수행하는 도구를 호출하는 셸입니다.mv [-f | -i | -n] [-v] source target
이 점을 설명하면 다음과 같습니다. mv
표준 입력을 통해 무엇을 해야 할지 알 수 없고 를 입력해야 하지만mv foo bar
할 수 있는마.echo "mv foo bar" | sh
인터프리터가 파일 인수를 받지 못하면 sh
표준 입력에서 명령을 읽고 이를 구문 분석한 후 mv
두 인수 및 를 사용 foo
하여 호출합니다 bar
.