나는 문제 xargs
와 pipe
명령에 어려움을 겪고 있습니다. 다음은 한 가지 예입니다 =
echo 'a' | xargs mkdir
이 명령은 이름이 a
.인 디렉터리를 생성합니다. 그래서 나는 이 명령이 다음과 동일하다는 것을 이해할 수 있습니다.mkdir a
그런데 왜 이 명령이 작동하지 않습니까 echo 'a' | mkdir
?
pipe
명령이 왼쪽 명령의 출력을 인수로 오른쪽 명령으로 전송할 때 명령 이 왼쪽 명령의 출력을 오른쪽 명령의 입력으로 전송한다는 것을 읽었습니다 | xargs
.
1-입력과 인수의 차이점은 무엇입니까?
2- echo 'a' | mkdir
이 명령이 작동하지 않는 이유는 무엇이며 이 명령과 동등한 것은 무엇입니까?
감사합니다...
답변1
간단한 대답
인수는 입력입니다.
더 긴 답변
다른 유형의 입력도 있습니다.
귀하의 예에서는 표준 입력을 읽을 것으로 echo 'a' | mkdir
예상됩니다 . mkdir
그러나 mkdir
이 작업을 수행하도록 작성되지 않았습니다.
입력이라고 부르는 것은 표준 입력( stdin
)입니다. 그리고 출력은 표준 출력( stdout
)입니다. 표준오차( )가 모두 있습니다 stderr
. 그리고 종료 코드입니다.
더 긴 답변 - 그렇다면 차이점은 무엇입니까?
프로그램이 시작되기 전에 인수를 사용할 수 있어야 합니다. 일반적으로 다음과 같습니다. 짧습니다. 옵션, 파일 이름 및 짧은 텍스트가 포함되어 있습니다.
표준 입력은 프로그램이 실행되는 동안 기록될 수 있습니다. 프로그램이 시작될 때 존재하지 않았던 데이터가 전송될 수 있습니다. 순서 없이 읽을 수 있다는 보장은 없습니다(따라서 순차적으로 읽으세요). 길이는 임의적일 수 있습니다. 인수로 더 많은 전송 파일 이름이 필요한 경우 프로세스당 하나의 표준 입력만 있습니다.
echo 'a' | xargs mkdir
없이 하는 방법xargs
mkdir "$(echo 'a')"
이는 $()
포함된 명령을 실행한 다음 및 $()
해당 내용을 해당 명령의 표준 출력으로 바꾸는 것을 의미합니다.
답변2
나 역시 이것 때문에 아주 오랫동안 혼란스러웠다. 조금 더 간단한 예를 들어 보겠습니다. (저는 bash 전문가가 아닙니다.)
wc "test"
wc <<< "test" (same as: echo "test" | wc)
이 둘의 결과는 매우 다릅니다. 첫 번째는 파일 읽기를 시도하고 test
, 두 번째는 을 보여줍니다 1 1 5
.
여기서 문제 wc "test"
는논쟁 "test"
입력으로 while wc <<< "test"
소요표준입력.
따라서 발행할 때 echo 'a' | xargs mkdir
(xargs는 인수로 실행을 나타냄)논쟁에게 mkdir
; 그것은 다음과 같습니다: mkdir a
.
반면에 발행할 때 echo 'a' | mkdir
(간단한 것은 : mkdir <<< 'a'
) stdin으로 전달합니다 a
.
mkdir
이러한 것들을 매우 다르게 취급하므로 결과가 표시됩니다.