컬은 pid를 인쇄한 다음 백그라운드에서 실행합니다.

컬은 pid를 인쇄한 다음 백그라운드에서 실행합니다.

간단한 요청으로 curl새로운 것을 경험했습니다 .

이 명령은 다음과 같이 컬에 대한 간단한 호출입니다.

curl http://example.com/endpoint/?arg1=val1&arg2=val2

호출은 500MB 이상의 XML 파일을 반환해야 -O하지만(준비되면 파일에 저장하겠습니다) 실제로 이상한 점은 없습니다.

이상한 점은 컬이 단지 pid를 출력한 다음 배경으로 들어간다는 것입니다:

[1] 31562

얼마 후 원격 파일이 콘솔과 백그라운드에 나타나기 시작했는데 이를 사용할 수 없었습니다 Ctrl+C.

나는 이런 일을 경험한 적이 없습니다. 1.9GB 파일을 다운로드하려고 하면:

curl -O https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso

정상적으로 사용 가능해요!

어떤 아이디어가 있나요?

일반 다운로드용 헤더:

curl -v -s https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso 1> /dev/null
*   Trying 92.123.112.141:443...
* TCP_NODELAY set
* Connected to download.microsoft.com (92.123.112.141) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
... more HTTPS stuff ...
} [5 bytes data]
> GET /download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso HTTP/1.1
> Host: download.microsoft.com
> User-Agent: curl/7.65.3
> Accept: */*
> 
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/octet-stream
< Accept-Ranges: bytes
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-blob-content-md5: mw6jWIuMir1+rZG9/mzj+A==
< Last-Modified: Sat, 13 Oct 2018 00:34:54 GMT
< ETag: "0x8D630A3B1CF6138"
< Content-Length: 2048196608
< Date: Mon, 10 Feb 2020 21:11:55 GMT
< Connection: keep-alive
< 
{ [16038 bytes data]
^C

내 휴대 전화:

*   Trying 192.168.0.200:80...
* TCP_NODELAY set
* Connected to example.com port 80 (#0)
> GET /endpoint/?arg1=val1&arg2=val2 HTTP/1.1
> Host: example.com
> User-Agent: curl/7.65.3
> Accept: */*
> 
^C

답변1

URL에 따옴표가 없는 &문자가 포함되어 있습니다. 이는 명령이 시작됨을 의미합니다.

curl http://example.com/endpoint/?arg1=val1

뒤에서 쉘 변수는 쉘이 행을 구문 분석할 때 URL의 다음 비트가 의미하는 것이기 때문에 arg2값으로 설정됩니다.val2

URL 주위에 따옴표를 사용하세요.

curl 'http://example.com/endpoint/?arg1=val1&arg2=val2'

&이 문자는 URL에 포함되어 있지 않더라도 ?와일드카드 문자입니다(파일 이름 와일드카드 패턴의 단일 문자와 일치) . 따라서 인용되지 않은 URL은 zsh기본 설정이 있는 셸에서 불만을 표시 하게 됩니다 no matches found. 또한 셸 옵션이 설정된 경우에도 셸에서 불만을 표시하게 됩니다 bash. 마찬가지로 일치하지 않는 패턴을 제거하도록 쉘이 구성된 경우(예: ) URL이 완전히 제거됩니다.no matchfailglobshopt -s nullglobbash


보너스:

curl명령을 다음과 같이 쓸 수도 있습니다 .

curl --silent \
    --url-query arg1=val1 \
    --url-query arg2=val2 \
    'http://example.com/endpoint/'

을 사용하면 데이터가 URL로 인코딩되고 파일에서 데이터를 로드할 수도 --url-query있습니다 ( 의미 체계를 관리하므로 curl설명서의 옵션을 참조 curl하고 거기에 있는 설명을 참조하세요 ). --data-urlencode또한 쉘 변수에서 얻은 값인 경우 쉘 변수 값을 URL 문자열에 직접 주입하는 것을 방지합니다.

또한 --variable무엇이 유용할 수 있는지 알아보십시오.

답변2

URL을 인코딩하려면 &를 %2로 바꾸세요.

이것은 작동합니다 - 컬 'http://example.com/endpoint/?arg1=val1%2arg2=val2'

인코딩된 URL과 함께 항상 컬을 사용하는 것이 좋습니다.https://www.urlencoder.org/

관련 정보