Mac OS X Catalina에서 실행 중인 파일을 찾지 못하는 쉘 스크립트

Mac OS X Catalina에서 실행 중인 파일을 찾지 못하는 쉘 스크립트

제안을 바랍니다. Mac OS X Catalina에서 쉘 스크립트를 사용하여 스크립트가 손상되었습니다. 많은 보안 변경 사항이 있다는 것을 알고 있지만 지금까지 다운로드 폴더에 액세스하는 수정 사항을 파악하지 못했습니다. 인쇄할 파일에 접근할 수 없기 때문에 스크립트 오류가 발생했습니다. 스크립트는 다음과 같습니다

do shell script "cat `ls -t /UserName/Downloads/Barcodes*.zpl | head -1` | lpr -P BarcodePrinter -o raw " with administrator privileges

파일 위치에 대해 여러 가지 수정을 시도했습니다. 다운로드 폴더는 여전히 *바코드 파일에서 생성된 20자 이상의 문자에 대해 가변적인 긴 이름의 파일을 가져오고 있습니다 . 프린터 이름은 여전히 ​​일치하지만 오류는 다음과 같습니다.

No such file or directory
lpr:  No file in print request

어떤 제안이라도 감사하겠습니다. 포럼을 검색했지만 초보자여서 올바른 솔루션을 찾아내지 못하는 것 같습니다.

답변1

명령 자체가 정확 zsh하다고 가정하고 macOS에서 셸을 사용합니다 .lpr

lpr -P BarcodePrinter -o raw < ~/Downloads/Barcodes*.zpl(.Nom[1])

glob (.Nom[1])한정자는 이전 globbing 패턴의 동작을 변경하여 일반 파일과만 일치하고(그렇게 .합니다), 일치하는 항목이 없으면 전혀 확장되지 않도록 합니다( 는 셸 에서 N에 해당함 ).nullglobbash

om[1]수정 시간 스탬프 순서대로 일치 결과를 정렬하고 목록에서 첫 번째 항목, 즉 일치하는 파일 중 가장 최근에 수정된 항목만 선택합니다 .

패턴이 어떤 것과도 일치하지 않는 경우(잘못된 디렉토리를 지정하거나 파일 이름을 잘못 입력한 경우) 쉘은 다음과 같이 불평합니다.

zsh: no such file or directory: ~/Downloads/Barcodes*.zpl(.Nom[1])

셸은 이러한 유형의 오류를 보고할 때 항상 찾을 수 없는 파일의 경로 이름을 기록합니다(이는 질문의 오류에서 누락되었으며 문제를 더 쉽게 진단할 수 있게 했을 것입니다).


아래 댓글에 게시된 추가 정보를 통해 파일의 실제 이름이 가 아닌 ~/Downloads/zebraBarcodes*.zpl또는 일치하는 것이 분명해졌습니다 . 업데이트된 패턴을 사용하여 위와 동일한 접근 방식이 작동합니다.~/Downloads/*Barcodes*.zpl~/Downloads/Barcodes*.zpl

답변2

여기서 발생할 수 있는 현상은 의 기본 동작이 ls파일을 열별로 stdout으로 인쇄하는 것이므로 여러 파일 이름이 한 줄에 포함될 수 있다는 것입니다. ls또한 전체 파일 이름(예: 디렉터리 접두어 포함)을 인쇄하지 않으므로 cd선택한 파일을 올바르게 대상으로 지정하려면 먼저 다음 명령을 위한 디렉터리로 이동하세요. 또한 ls그런 파일을 필터링하기 위해 glob을 사용하지 않을 것입니다 . grep정규식을 사용하는 를 사용하세요 .

노력하다:

cd /Username/Downloads | dir -w 1 -t /UserName/Downloads/ | grep "^Barcodes.*\.zpl$" | head -1 | lpr -P BarecodePrinter -o raw

또한 프린터 "BarecodePrinter"의 철자가 올바른지 확인하세요.

그래요~ 아니다구문 분석을 위해 파일을 사용하거나 ls나열 하는 것이 더 좋을 것이지만 마술 없이 시간별로 정렬하도록 올바르게 설정하는 방법을 모르겠습니다 .dirfindlsawk

find, 및 :sortawk

find /UserName/Downloads -maxdepth 1 -printf "\n%AD %AT %p\n" | grep ".*Barcodes.*\.zpl$" | sort -r | awk '{ print $3 }' | head -1 | lpr -P BarecodePrinter -o raw

find심지어 악명 높은 것처럼 보이는 부적절하게 이스케이프된 파일 이름으로 인해 이 문제가 발생할 수 있습니다 . 이것을 더욱 안전하게 만드는 것은 확실히 가능하지만, 그것은 내 손이 닿지 않는 곳에 있습니다. 다른 사용자에게 맡기겠습니다.

관련 정보