
Надеюсь на предложение. Использую скрипт оболочки в 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
соответствует , ).nullglob
bash
Упорядочивает 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
first, чтобы попасть в каталог для последующих команд, чтобы правильно нацелиться на выбранные файлы. Я бы также не стал использовать 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
по-видимому, печально известно. Определенно можно сделать это еще безопаснее, но это вне моей досягаемости. Я оставлю это другим пользователям.