같은 줄의 컬 명령 후 텍스트 에코

같은 줄의 컬 명령 후 텍스트 에코
#!/bin/bash
echo "$(curl -s -I https://google.com|grep Server)" abc

반품:

abcer: gws

다음 bash -x을 표시합니다.

++ grep Server
++ curl -s -I https://google.com
' abco 'Server: gws
 abcer: gws

하지만

echo abc "$(curl -s -I https://google.com|grep Server)"` 

반품

abc Server: gws

즉, 컬 명령 다음에 텍스트를 추가하면 손상되지만, 컬 명령 앞에 추가하면 괜찮습니다.
뭐가 문제 야? 나는 그것을 알아낼 수 없다.

답변1

HTTP 표준에서는 모든 헤더 행과 헤더 끝을 표시하는 빈 행이 CRLF(캐리지 리턴 줄 바꿈)로 종료되어야 한다고 규정합니다. 많은 클라이언트가 자유주의적이고 LF만 허용하지만 대부분의 서버(Google 포함)는 표준을 존중합니다.

curl -ICR 문자를 포함하여 서버에서 보낸 것과 정확히 동일한 헤더를 표시합니다. Unix 시스템에서는 CR 문자가 줄의 일부이고 LF 문자만 줄을 끝냅니다. 명령 대체는 후행 LF 문자를 제거하지만 CR 문자는 그대로 유지합니다. 따라서 명령 대체는 $(curl -s -I https://google.com|grep Server)(귀하의 경우) 문자열 Server: gws␍( 캐리지 리턴은 어디에 있습니까)을 반환하고 명령 echo "$(curl -s -I https://google.com|grep Server)" abc표시에는 다음이 포함됩니다.

Server: gws␍abc

이 문자는 줄의 처음 세 문자를 덮어쓰도록 커서를 줄의 시작 부분으로 이동하라는 터미널 명령입니다 .abc

이는 또한 Trace from이 bash -x약간 왜곡된 이유를 설명합니다.

이 명령은 echo abc "$(curl -s -I https://google.com|grep Server)"다음을 포함하는 행을 표시합니다.

Server: gwsabc␍

␍ 문자는 커서를 줄의 시작 부분으로 이동하고 개행 문자는 커서를 다음 줄의 시작 부분으로 이동하므로 ␍는 눈에 보이는 효과가 없습니다.

CR로 인한 복잡함을 방지하려면 입력에서 CR을 제거하세요.

echo "$(curl -s -I https://google.com | tr -d '\r' | grep Server)" abc

답변2

echo $(curl -s -I https://google.com|grep Server)|cat -A

컬이 반환한 값에 ^M(캐리지 리턴 문자)이 있음을 보여줍니다. 컬의 출력을 인쇄할 때 캐리지 리턴은 "커서"를 줄의 시작 부분으로 다시 가져온 다음 "abc"를 인쇄하고 "Serv"를 덮어씁니다.

두 번째 시도에서는 캐리지 리턴이 눈에 띄는 효과가 없습니다.

답변3

캐리지 리턴을 제거하려면 다음을 시도해 보십시오.

 echo "$(curl -s -I https://google.com|grep Server)" abc | tr -d "\r"

산출:

서버: GFE/2.0 abc

관련 정보