GNU bash 버전 3.2.48에는 이 버그가 있습니다. 버전 3.2.57은 더 이상 사용할 수 없습니다.
8000개의 동일한 라인을 포함하는 파일을 만듭니다(각 라인이 기록된다고 가정 1
). split -a3 -p "1"
run on it ( 주어진 패턴에 따라 분할되도록 하는 -p
BSD 옵션입니다 . 한 줄에 한 줄만 있는 파일의 경우 실행하여 표준과 동일한 작업을 수행할 수 있습니다.) 그리고 실행split
1
split
split -a3 -b 1
find . -name xaaa -exec echo {} +
예상된 출력 후에 find: fts_read: Invalid argument
는 로 출력 됩니다. cerr
파일 세트와 시도한 다른 명령으로 xaaa
대체하면 동일한 오류가 발생합니다 . echo
파일 이름의 길이는 중요하지 않습니다. 파일의 디렉토리도 중요하지 않습니다.
다른 곳에서 일부 파일을 생성한 후 오류가 사라졌습니다. 그러나 여러 파일을 포함하는 다른 와일드카드(또는 적어도 하나가 디렉터리 목록의 시작 부분에 있음) xaaa
로 바꾸면 오류가 다시 발생합니다. xaa*
현재로서는 오류를 일으키는 단일 파일이 없습니다.
+
다음 으로 바꾸면 ;
오류가 방지되지만 내 스크립트에서는 허용되지 않습니다. 이 문제는 내 스크립트의 다른 경우에 간헐적으로 발생했지만 문제를 줄임으로써 이를 복제하는 간단한 방법을 알아낼 수 있었습니다.
오류가 발생하면 스크립트를 중지하고 싶지만 이렇게 하면 스크립트가 자주 중지됩니다. 이 문제를 해결하는 방법을 아시나요? (예를 들어 오류 코드를 검색하고 이 특정 오류를 무시합니다.)
맥 OS 버전 10.8.5. 다윈 커널 버전 12.5.0.
답변1
bash가 관련될 가능성은 거의 없습니다.
Bash의 역할은 이 코드를 구문 분석하고 , , , , , 를 사용하여 find . -name xaaa -exec echo {} +
실행 으로 변환하는 것입니다. 모든 bash 버전은 동일한 작업을 수행합니다./path/to/find
find
.
-name
xaaa
-exec
echo
{}
+
여기에서 find:
오류 메시지의 접두사로 오류는 에 의한 find
것이 아니라 에 의한 것입니다 bash
. 특히 함수에서 반환된 오류에 관한 것입니다 fts_read()
.
macos find
는 FreeBSD 버전으로, Apple에서 수정했을 수 있습니다.
고맙게도 FreeBSD(Macos가 아니라면)는 FLOSS이고 상대적으로 찾기 쉽습니다.오류가 코드에 출력됩니다..
/*
* find_execute --
* take a search plan and an array of search paths and executes the plan
* over all FTSENT's returned for the given search paths.
*/
int
find_execute(PLAN *plan, char *paths[])
[...]
e = errno;
finish_execplus();
if (e && (!ignore_readdir_race || e != ENOENT))
errc(1, e, "fts_read");
return (exitstatus);
}
함수가 끝나면 find_execute
.
여기서 우리는 다음을 얻습니다:
find: fts_read: Invalid argument
Invalid argument
errno 에 해당하는 오류 메시지입니다 EINVAL
.
여기서 호출이 이루어지기 전 루프의 조건문에서 as가 0 errno
으로 설정되어 있으며 fts_read
루프를 종료하므로 this 수단만 반환됩니다.errno
while
fts_read
fts_read
NULL
당신이 보면매뉴얼 페이지fts_read
, 당신은 발견 할 것이다:
함수
fts_read()
및fts_children()
는 실패할 수 있으며errno
라이브러리 함수, 및 에서 지정한 오류를 설정할 수 있습니다.chdir(2)
malloc(3)
opendir(3)
readdir(3)
stat(2)
이러한 링크를 따라 다른 매뉴얼 페이지로 이동하면 그 중 어느 것도 EINVAL을 반환하지 않습니다.
find
따라서 Apple 이나 fts
라이브러리 의 버그와 매우 유사해 보입니다 . 코드에 접근할 수 없으면 우리가 할 수 있는 일이 많지 않을 수 있으므로 이 문제를 Apple 지원에 제기하는 것이 좋습니다.