현재 명령을 실행 중입니다. echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"
표준 출력을 가져온 echo "hello world"
다음 옵션을 func_wordcount
사용 하도록 파이프합니다 -d
. 이 -d
옵션은 원시 데이터를 보내는 데 사용되며, my는 func_wordcount
원시 데이터 입력을 허용하고 단어 수와 문자 수를 인쇄합니다.
예를 들어, 내가 글을 쓸 때 echo "hello" | xargs curl http://localhost:8080/function/func_wordcount -d"
출력은 1, 5입니다. 이는 5개의 문자를 포함하는 단어가 있음을 의미합니다.
하지만 많은 단어를 포함하려고 하면 오류가 발생합니다. 글을 쓸 때 echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"
출력 1, 5가 나온 다음 오류가 있는 개행 문자가 표시됩니다 curl: (6) could not resolve host: world
. 따라서 해당 옵션을 사용하여 stdout을 원시 데이터로 변환하면 hello world가 두 단어로 분할된다고 확신합니다 -d
.
또한 함수가 파이프와 변환 없이 작동한다는 것을 보여주기 위해 함수를 실행하면 curl http://localhost:8080/function/func_wordcount -d "hello world"
2, 11이 표시되어 단어 2개와 문자 11개가 있음을 보여줍니다.
내 질문은 이 분할 문제를 해결하는 방법입니다. 내가 혼란스러워하는 부분은 입력의 전반부만 구문 분석하여 완료한 다음 데이터 덩어리를 보내는 대신 두 번째 부분에서 오류를 발생시키는 이유입니다. 공백으로 전혀 구분되지 않은 입력만 보낼 수 있으므로 기능 사용이 매우 제한됩니다.
답변1
그게 다야 xargs
. 표준 입력에서 단어 목록(공백 또는 줄 바꿈으로 구분되며 일부 형식의 인용도 이해함)을 받아들이고 전달합니다.그들을실행되는 명령에 대한 인수로.
hello word
여기에서 매개변수로 전달 하려면 curl
다음이 필요합니다.
echo '"hello world"' | xargs curl...
여기서 이는 공백 사이의 공백이 매개변수 구분 기호로 처리되는 것을 xargs
방지하기 위한 인용 메커니즘으로 이해됩니다 . "..."
또한 (POSIX 셸과 다른 방식으로) 이해합니다.hello
world
xargs
\
'...'
GNU를 사용하면 xargs
구분 기호를 지정할 수도 있습니다. 예를 들어:
echo hello world | xargs -d '\n' curl...
줄 바꿈만 구분 기호(공백 아님)로 인식되며 인용 메커니즘은 비활성화됩니다.
이를 통해 각 단어가 아닌 각 줄의 내용을 명령에 대한 인수로 전달할 수 있습니다.
-d
GNU 외부에서는 거의 지원되지 않지만 xargs
NUL 을 -0
구분하고 인용 처리를 비활성화하는 또 다른 확장이 더 광범위하게 지원됩니다. 따라서 다음과 같이 할 수도 있습니다.
echo hello world | tr '\n' '\0' | xargs -0 curl...
여러 줄의 입력이 있는 경우 xargs
모든 줄은 별도의 인수로 전달됩니다 . 각 줄마다 하나씩 호출 curl
하려면 옵션을 추가할 수 있습니다.curl
-n 1
다음을 사용할 수도 있습니다.
echo hello world | xargs -I@@ curl... @@
이는 curl
각 줄마다 하나씩 호출되지만 선행 공백이 제거되고 xargs
일부 인용이 여전히 수행되므로 임의의 데이터는 피해야 합니다.
답변2
xargs
표준 입력, 구분 기호에서 항목 읽기공백(큰따옴표, 작은따옴표 또는 백슬래시로 보호할 수 있음)또는 개행 문자, 초기 인수를 사용하여 명령을 한 번 이상 실행한 다음 표준 입력에서 읽은 항목을 실행합니다.
즉, 기본 동작은 입력의 모든 공백이 구분 기호 역할을 하므로 hello world
실제로 두 개의 인수가 생성된다는 것입니다.
xargs가 전체 행을 그대로 유지하려면 `xargs -d '\n'을 사용하십시오(GNU xargs에서는 다른 것을 기억할 수 없습니다).
그러나 여러 인수가 주어지면 여전히 여러 줄의 입력이 발생합니다 curl
. 이를 방지하고 curl
각 입력 라인에 대해 명령을 한 번 실행하려면 를 사용하십시오 xargs -d '\n' -n 1
.
입력에 한 줄만 포함된 경우 파이핑 대신 명령 대체를 사용할 수 있습니다.
curl http://... -d "$(echo "hello world")"