이 질문에 대답 하면 또 다른 질문이
생겼습니다. 다음 스크립트는 같은 일을하고 두 번째 스크립트는 훨씬 빨라야한다고 생각했습니다. 첫 번째 스크립트는 cat
반복해서 파일을 열어야하지만 두 번째 스크립트는 파일 만 열어야 하기 때문입니다. 한 번만 변수를 에코합니다.
(올바른 코드는 업데이트 섹션을 참조하십시오.)
먼저:
#!/bin/sh
for j in seq 10; do
cat input
done >> output
둘째:
#!/bin/sh
i=`cat input`
for j in seq 10; do
echo $i
done >> output
입력은 약 50MB입니다.
그러나 두 번째 것을 시도했을 때 변수를 에코하는 i
것이 거대한 프로세스 이기 때문에 너무 느 렸습니다 . 또한 두 번째 스크립트에 문제가 있습니다. 예를 들어 출력 파일의 크기가 예상보다 작습니다.
또한의 맨 페이지를 확인 echo
하고 cat
이를 비교하기를 :
echo-한 줄의 텍스트를 표시
cat-파일을 연결하고 표준 출력에 인쇄
그러나 나는 차이를 얻지 못했습니다.
그래서:
- 왜 두 번째 스크립트에서 고양이가 너무 빠르고 에코가 너무 느립니까?
- 아니면 변수의 문제
i
입니까? (Man 페이지echo
에는 "텍스트 라인"이 표시 되어 있기 때문에 짧은 변수에만 최적화되어 있지만 매우 긴 변수에는 최적화되지 않았다고i
생각합니다. 그러나 그것은 단지 추측에 불과합니다.) - 내가 왜 사용할 때 문제가 발생
echo
합니까?
최신 정보
seq 10
대신 `seq 10`
잘못 사용 했습니다 . 이것은 편집 된 코드입니다.
먼저:
#!/bin/sh
for j in `seq 10`; do
cat input
done >> output
둘째:
#!/bin/sh
i=`cat input`
for j in `seq 10`; do
echo $i
done >> output
( roaima 덕분에 특별 감사합니다 .)
그러나 문제의 핵심은 아닙니다. 루프가 한 번만 발생하더라도 동일한 문제가 발생합니다 . cat
보다 훨씬 빠르게 작동합니다 echo
.
echo
빠릅니다. 당신이 빠진 것은 변수를 사용할 때 따옴표를 쓰지 않음으로써 쉘이 너무 많은 일을하도록한다는 것입니다.
printf '%s' "$i"
아니라 원하는 것 echo $i
입니다. @cuonglm은 그의 답변에서 에코의 문제 중 일부를 잘 설명합니다. echo가있는 경우 인용이 충분하지 않은 이유는 unix.stackexchange.com/questions/65803/…
cat $(for i in $(seq 1 10); do echo "input"; done) >> output
어때요? :)