Скрипт оболочки не находит файл, запущенный в 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])

Квалификатор (.Nom[1])glob изменяет поведение предыдущего шаблона подстановки таким образом, что он сопоставляется только с обычными файлами (именно это и .происходит), а при отсутствии совпадений он вообще не расширяется ( в оболочке 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также не выводит полные имена файлов (т. е. включая префикс каталога), поэтому используйте cdfirst, чтобы попасть в каталог для последующих команд, чтобы правильно нацелиться на выбранные файлы. Я бы также не стал использовать glob in lsдля фильтрации файлов таким образом. Используйте grep, который использует регулярные выражения.

Пытаться:

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

Также проверьте правильность написания названия вашего принтера «BarecodePrinter».

Я делаюнетрекомендую использовать lsили dirдля составления списка файлов для анализа, findбыло бы лучше, но я не знаю, как правильно настроить сортировку по времени, как lsбез awkмагии.

С find, sortи awk:

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по-видимому, печально известно. Определенно можно сделать это еще безопаснее, но это вне моей досягаемости. Я оставлю это другим пользователям.

Связанный контент