파일을 인수로 받아들이고 파일이 존재하는지 확인한 다음 stdin에서 가져온 모든 내용을 파일에 쓰는 bash 함수가 있습니다. 이 간단한 솔루션은 텍스트에는 작동하지만 임의의 이진 데이터에는 문제가 있습니다.
echo -n '' >| "$file" #Truncate the file
while read lines
do # Is there a better way to do this? I would like one...
echo $lines >> "$file"
done
답변1
$IFS
귀하의 접근 방식은 읽기를 분할하는 데 사용되는 구분 기호( )의 공간에 작성하는 모든 항목에 줄바꿈을 추가하는 것입니다. 줄 바꿈으로 나누지 말고 전체를 전달하십시오. 위의 전체 코드를 다음과 같이 단순화할 수 있습니다.
cat - > $file
잘림 비트가 필요하지 않습니다. 이렇게 하면 전체 STDIN 스트림이 잘리고 여기에 기록됩니다.
편집하다:zsh를 사용하는 경우 > $file
대신 cat을 사용할 수 있습니다. 파일로 리디렉션하고 자르지만, STDIN을 받아들이기를 기다리는 것이 있으면 그 시점에서 읽혀집니다. 내 생각에는 bash를 사용하여 이와 같은 작업을 수행할 수 있지만 몇 가지 특수 모드를 설정해야 합니다.
답변2
read
텍스트 파일을 문자 그대로 읽으려면 다음 두 가지 방법으로 출력을 처리하는 plain 을 사용하지 마십시오 .
read
이 기능을 끄는\
데 사용되는 이스케이프 문자로 해석됩니다 .read -r
read
;;의 문자를 단어로 분할하여 끄려면 빈 문자열로$IFS
설정하세요 .IFS
텍스트 파일을 한 줄씩 처리하는 일반적인 관용어는 다음과 같습니다.
while IFS= read -r line; do …
이 관용구에 대한 설명은 다음을 참조하세요.while IFS= read
대신 왜 그렇게 자주 사용됩니까 IFS=; while read..
?.
문자열을 문자 그대로 작성하려면 plain 을 사용하지 말고 echo
두 가지 방법으로 문자열을 처리합니다.
- 일부 쉘에서는
echo
백슬래시 이스케이프를 처리합니다. (Bash에서는xpg_echo
이 옵션의 설정 여부에 따라 달라집니다.) -n
일부 문자열은 또는 같은 옵션으로 처리됩니다-e
(정확한 설정은 셸에 따라 다름).
문자 그대로 문자열을 인쇄하는 이식 가능한 방법은 를 사용하는 것입니다 printf
. (입력이 처럼 보이지 않는 옵션을 알지 않는 한 bash에는 더 좋은 방법이 없습니다 echo
.) 추가하려는 경우 첫 번째 형식을 사용하여 정확한 문자열을 인쇄하십시오. 줄바꿈 문자인 경우 두 번째 형식을 사용하세요.
printf %s "$line"
printf '%s\n' "$line"
이는 처리에만 적합합니다.텍스트, 왜냐하면:
- 대부분의 쉘은 입력에서 널 문자를 차단합니다.
- 마지막 줄을 읽을 때 끝에 개행 문자가 있는지 알 방법이 없습니다. (일부 오래된 쉘은 입력이 개행 문자로 끝나지 않으면 더 큰 문제가 있을 수 있습니다.)
셸에서는 바이너리 데이터를 처리할 수 없지만 unice에 있는 대부분의 최신 유틸리티 버전은 임의의 데이터를 처리할 수 있습니다. 모든 입력을 출력으로 전달하려면 cat
.Off-topic을 사용하세요 echo -n ''
. 아무 것도 하지 않는 복잡하고 이식성이 없는 방법입니다. echo -n
마찬가지로 좋고(경우에 따라 다르지만) :
훨씬 더 간단하고 완전히 이식 가능합니다.
: >| "$file"
cat >>"$file"
아니면 더 간단하게,
cat >|"$file"
스크립트에서는 기본적으로 꺼져 있으므로 >|
일반적 으로 사용할 필요가 없습니다 .noclobber
답변3
이것은 정확히 당신이 원하는 것을 할 것입니다:
( while read -r -d '' ; do
printf %s'\0' "${REPLY}" ;
done ;
# When read hits EOF, it returns non-zero which exits the while loop.
# That data still needs to be output:
printf %s "${REPLY}"
) >> ${file}
하지만 메모리 사용량에 주의하시기 바랍니다. 이는 null로 구분된 방식으로 입력을 읽습니다.
만약 없다면\0
유효하지 않은입력에 바이트가 포함되어 있으면 bash는 먼저 입력의 전체 내용을 메모리로 읽은 다음 출력해야 합니다.
자르기 단계와 관련하여:
echo -n '' >| "$file" #Truncate the file
더 간단하고 동등한 접근 방식은 다음과 같습니다.
> ${file} #Truncate the file