ksh에서는 작동하지 않지만 sh에서는 잘 작동하는 다음 줄이 있습니다.
cat `find /home/peter/databases -name "cells.txt"`
이 줄이 /usr/bin/sh 스크립트 안에 있으면 작동합니다. 하지만 /usr/bin/ksh 안에 있을 때는 그렇지 않습니다.
왜 이런 일이 발생하는지 힌트가 있나요?
나는 다음을 사용하고 있습니다 :
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 4
"작동하지 않음"은 스크립트가 중단되었음을 의미합니다( cat
파일 이름을 인수로 제공하지 않는 동작과 유사).
find /home/peter/databases -name "cells.txt"
ksh 스크립트의 출력은 비어 있지 않습니다. 이 경우 스크립트는 발견된 파일을 나열할 수 있습니다. 그런데 위에서 언급한 백틱을 사용하여 찾은 파일을 캡처하려고 하면 문제가 발생합니다.
find 명령은 거의 1000개의 파일을 나열하지만 대부분은 비어 있습니다. 위에서 언급한 cat 명령은 sh에서는 유효하지만 ksh에서는 유효하지 않습니다.
- 네임스페이스가 포함된 파일이 존재하지 않습니다.
- cell.txt 파일의 내용이 비어 있거나 단일 명령문입니다.
- /home/peter/databases 아래의 파일 수가 적으면 명령(cat `find /home/peter/databases -name "cells.txt"`)이 제대로 작동합니다. 이 예에서 파일 수는 1000입니다.
- SUSE 11.3 ksh에서도 동일한 명령이 실행됩니다. 하지만 SUSE 11.4에서 실행하면 실패합니다.
- 방금 /home/peter/databases 아래의 디렉토리에 cell.txt라는 파일 몇 개를 보관했는데 명령이 제대로 작동했습니다. cells.txt라는 파일이 약 1000개까지 커지면 명령이 출력을 제공하지 않습니다(중지). 백틱을 출력하는 데 일부 버퍼가 사용되었기 때문인 것 같습니다. (``) SUSE 11.3에는 문제가 없지만 11.4에서는 중단되기 때문입니다.
-size +0
이 명령은 find와 함께 이 옵션을 사용합니다. 버퍼에 대해 다시 말씀해 주시겠습니까?
답변1
cat
파일이 발견된 경우에만 호출하는 대체 솔루션으로 이것을 사용해 보십시오.
find /home/peter/databases -type f -name 'cells.txt' -exec cat {} +
(귀하의 버전이 find
후행을 인식하지 못하는 경우 +
두 문자로 바꾸십시오 \;
.)
답변2
스크립트는 find 명령에서 0 파일 크기를 무시하여 작동합니다. (-크기 +0)
cat `find /home/peter/databases -name "cells.txt" -size +0`
다른 솔루션에도 동의합니다. 하지만 제 질문은 ksh가 cat을 처리할 수 없는 이유가 버퍼 크기(백틱 출력) 때문인지 찾는 것이었기 때문에 답변을 게시했습니다. @wurtel: 감사합니다. 귀하의 제안으로 문제가 해결되었습니다.