
쉘 스크립트에서...
후행 줄 바꿈을 제거하지 않고 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)