후행 줄 바꿈을 제거하지 않고 stdin을 변수에 캡처하려면 어떻게 해야 합니까?

후행 줄 바꿈을 제거하지 않고 stdin을 변수에 캡처하려면 어떻게 해야 합니까?

쉘 스크립트에서...

후행 줄 바꿈을 제거하지 않고 stdin을 변수에 캡처하려면 어떻게 해야 합니까?

이제 나는 다음을 시도했습니다.

var=`cat`
var=`tee`
var=$(tee)

모든 경우에 $var입력 스트림에는 후행 줄 바꿈이 없습니다. 감사해요.

또한: 있는 경우아니요입력에 후행 개행 문자가 있는 경우 솔루션은 다음과 같아야 합니다.하나 추가.

허용된 답변을 기반으로 업데이트:

내 코드에서 사용한 최종 솔루션은 다음과 같습니다.

function filter() {
    #do lots of sed operations
    #see https://github.com/gistya/expandr for full code
}

GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"

전체 코드를 보고 싶다면 github 페이지를 참조하세요.증량제, 약간의 오픈 소스git 키워드 확장 필터정보 보안 목적으로 개발한 쉘 스크립트입니다. 정해진 규칙에 따라.git속성파일(지점별로 다를 수 있음) 및자식 구성, git은 각 파일을 파이프합니다.확장기쉘 스크립트는 저장소에 체크인하거나 체크아웃할 때마다 실행됩니다. (이것이 후행 또는 누락된 줄바꿈을 유지하는 것이 중요한 이유입니다.) 이를 통해 민감한 정보를 정리하고 테스트, 스테이징 및 라이브 분기에 대한 다양한 환경별 값 세트를 교환할 수 있습니다.

답변1

값이 변수에 저장되기 전에 후행 줄 바꿈이 제거됩니다. 다음과 같은 작업을 수행할 수 있습니다.

var=`cat; echo x`

${var%x}대신 사용하세요 $var. 예를 들면 다음과 같습니다.

printf "%s" "${var%x}"

이것은 후행 개행 문제를 해결하지만 널 바이트 문제(stdin이 텍스트가 아닌 경우)는 해결하지 않습니다.POSIX 명령에 따라 교체:

출력에 null 바이트가 포함되어 있으면 동작이 지정되지 않습니다.

그러나 쉘 구현은 널 바이트를 보유할 수 있습니다.

답변2

read내장된 함수를 사용하여 이 작업을 수행 할 수 있습니다 .

$ IFS='' read -d '' -r foo < <(echo bar)

$ echo "<$foo>"
<bar
>

STDIN을 읽는 스크립트의 경우 다음을 수행하십시오.

IFS='' read -d '' -r foo

 

이것이 어떤 쉘에서 작동하는지 잘 모르겠습니다. 그러나 bash와 zsh 모두에서 잘 작동합니다.

답변3

다음을 수행할 수 있습니다.

input | { var=$(sed '$s/$/./'); var=${var%.}; }

$var어쨌든 일단 그룹에서 나가면 { current shell ; }당신이 한 모든 일은 사라질 것입니다. 하지만 다음과 같이 작동할 수도 있습니다.

var=$(input | sed '$s/$/./'); var=${var%.}

답변4

이 솔루션의 이식성과 견고성에 대해서는 언급할 수 없지만 기대에 부응했습니다.

var=$(</dev/stdin)

관련 정보