두 Linux 시스템이 동일한 구문의 명령으로 다르게 동작하는 이유는 무엇입니까?

두 Linux 시스템이 동일한 구문의 명령으로 다르게 동작하는 이유는 무엇입니까?

나는 2 대의 컴퓨터를 사용하고 있는데 둘 다입니다.Red Hat Enterprise Linux AS 릴리스 3(Taroon 업데이트 2) (저는 /etc/*-release에서 확인합니다).

ps -p $$나는 그들이 bash라는 동일한 기본 쉘을 사용하고 있는지 확인했습니다 .

와일드카드 패턴을 사용하여 find 명령을 실행하려고 했습니다. find path -name 패턴 -type f -ctime +3

패턴에는 * 문자가 와일드카드로 포함되어 있습니다.

첫 번째 시스템은 와일드카드 문자를 확장하여 오류를 일으키는 것 같습니다.

find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression

예를 들어 2개의 구분된 qoute 사이에 패턴을 만들거나 스크립트에서 와일드카드 확장을 억제하는 데 \"sftp_bcs_report_*.log\"사용해야 합니다.set -f

다른 기계에서는 그런 문제가 없습니다. 어떤 생각이 있나요?

답변1

기본적으로 쉘은 파일이 일치하는 경우 와일드카드를 확장하지만 일치하지 않으면 확장되지 않은 상태를 유지합니다. 예를 들어, 이것을 실행하면 touch /tmp/111; touch /tmp/11*/tmp/111에 mtime이 생성되고 업데이트되지만, /tmp가 비어 있지만 호출하면 touch /tmp/11*/tmp에 "11*"이라는 파일이 생성됩니다.

이것은 쉘의 다소 이상한 특징입니다. 때로는 중간 기능으로 특별한 해킹 없이는 적절한 확장이 불가능합니다. 대부분의 최신 쉘은 일반적인 경우를 위한 특별한 옵션을 고안합니다. 예를 들어 bash의 "shopt -s failureglob"은 와일드카드 일치가 실패하는 명령 실행을 거부합니다.

find의 와일드카드 확장에 의존하므로 이러한 패턴은 쉘의 확장에 대해 인용되어야 합니다.

find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7

(작은따옴표 참고). 0개 또는 1개의 파일을 사용하면 작동하지만 2개 이상의 파일을 사용하면 명령 구문이 깨져서 불평합니다. 동료가 말한 내용입니다.Arcege. "set -f"는 확장을 완전히 비활성화합니다. 음, 이는 진단을 위한 좋은 척도이지만 향후 이동을 위해 수중 갈퀴를 제공할 수 있습니다. 견적이 더 간단해졌습니다 :)

답변2

두 번째 시스템의 시작 디렉터리에 일치하는 파일이 없고 sftp_bcs_report_*.log첫 번째 서버에 해당 파일이 두 개 이상 있는 것 같습니다. 를 사용하려면 find패턴을 항상 인용해야 합니다.

관련 정보