2017-12-20 36 views
1

의 명령은 왜이 같은 결과를 얻는 아니다쉘은 내가 할 때 유형 대 몇 가지 명령 (컬) 에코 터미널

HTTP/1.1 200 OK 
Connection: keep-alive 
Server: meinheld/0.6.1 
Date: Wed, 20 Dec 2017 19:20:56 GMT 
Content-Type: text/html; charset=utf-8 
Content-Length: 13011 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Credentials: true 
X-Powered-By: Flask 
X-Processed-Time: 0.00580310821533 
Via: 1.1 vegur 

2. 포함 된 파일 APIConnection.sh
만들기 :

#! /bin/bash 

api_url_1="www.httpbin.org" 

echo `curl -I $api_url_1` 

그런 다음 내 터미널로 이동하여 파일을 실행합니다 ./APIConnection.sh 결과 : echo `curl -I $api_url_1` 실행하는 것은 당신에게 표준 오류의 결과를 제공하는 동안

% Total % Received % Xferd Average Speed Time Time  Time Current 
          Dload Upload Total Spent Left Speed 
    0 13011 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0 
    Via: 1.1 vegurme: 0.0147929191589 true 
+1

스크립트에서'echo'를 제거하고 동일한 결과 – Zlemini

+0

@Zlemini을 얻을 것이다 , ... * 꽤 * 같지 않아 - 표준 출력이 TTY 문제와 관련이 있는지 여부. –

+0

@NicolasN, ... 여기서 두 개의 별개의 질문이 있습니다. 하나, 왜'echo $ (...)'가 한 줄에'...'의 모든 출력을 넣는 지요?이 질문은 절대적으로 FAQ입니다. [BashPitfalls # 14] (http://mywiki.wooledge.org/BashPitfalls#echo_.24foo)에서 다루며 http://shellcheck.net/을 통해 코드를 실행하십시오. 둘째, 백분율/상태 표시 줄은 한 케이스에만 있고 다른 시트에는없는 이유는 무엇입니까?이는 '컬 (curl)'과 관련된 질문입니다. (다른 프로그램들도 isatty() 결과에 따라 기본 출력을 구분하기 때문에 유사한 조건에서 차이가있을 수 있습니다). –

답변

2

역 따옴표 사이 curlman curl에 설명되어 실행할 때 진행률 표시 줄 만 표시되는 이유 :

PROGRESS METER

curl normally displays a progress meter during operations, 
    indicating the amount of transferred data, transfer speeds 
    and estimated time left, etc. The progress meter displays 
    number of bytes and the speeds are in bytes per second. The 
    suffixes (k, M, G, T, P) are 1024 based. For example 1k is 
    1024 bytes. 1M is 1048576 bytes. 

    curl displays this data to the terminal by default, so if you 
    invoke curl to do an operation and it is about to write data 
    to the terminal, it disables the progress meter as otherwise 
    it would mess up the output mixing progress meter and 
    response data. 

당신이 진행 미터를 끄려면 명시 적으로이 작업은 --silent을 사용하여 수행 할 수 있습니다.

``은 bash 및 기타 POSIX 호환 쉘에서 command substitution의 레거시 구문입니다. 이것은 출력이 터미널에 직접 기록되지 않고 쉘에 의해 캡처됨을 의미합니다. curl은 나중에 echo에 의해 터미널에 쓰여지는 것을 감지 할 수 없으므로 위에서 설명한대로 진행률 미터를 비활성화하지 않습니다. 당신이 정말로 (대신 스크립트가 어떤 명령 치환하지 않고 또는 에코 curl -I "$api_url_1"를 실행하는 데) 여기에 명령 치환을 사용하려는 경우

은 문자열 분할 및 글로브 확장을 피하기 위해 명령 치환 주위에 따옴표를 넣어.

그것은 현대 명령 치환 구문, $()를 사용하는 것도 좋습니다, 그래서 각각의 대체는 자신의 인용 컨텍스트가 있습니다

echo "$(curl --silent -I "$api_url_1")" 
+0

Thx, 답변을 업데이트했습니다. –

+0

구체적인 조언을 제공하기 위해 조금 더 편집해도 마음에 드십니까? –

+0

문제 없습니다. –

0

실행 curl -I www.httpbin.org는 당신에게 표준 출력의 결과를 제공합니다. 자세한 내용은 about stdin, stdout and stderr에서

curl -I www.httpbin.org 1>so.txt 2>se.txt 

보기 : 는 차이가 다음 명령을 실행 한 후 생성 se.txtso.txt 파일의 내용을보고 참조하십시오.

+1

'echo'와 명령 치환을 가진 버전이 stderr만을 내 보낸다고 말하는 것은 사실이 아닙니다. stdout은 FIFO에 쓰여지고, string-split과 glob-expanded가되고, 인수로'echo'에 전달됩니다. 그것들 중 일부는'stderr'의 진행 막대에 의해 덮어 써서 커서를 줄의 끝으로 되돌려 놓기 때문에 렌더링되지 않지만 stdout의 일부 내용은 절대적으로 존재합니다 (그리고 OP의 명시된 출력에서 ​​볼 수 있습니다). –