После обновления мой скрипт cron не находит команду /usr/sbin/ssmtp

зш:

myfile.iso

будет делать это только с операторами (, если не в shэмуляции ). Тем не менее, он по-прежнему выполняет команду $NULLCMD(catпо умолчанию ), чтобы выполнять фактическое чтение и запись.


Предлагаемый вами синтаксис

/dev/cdrom > myfile.iso

на самом деле может работать теперь в любой оболочке POSIX, потому что это не обязательно связано с оболочкой вообще.

Требуется, чтобы /dev/cdromбыл исполняемым и чтобы при выполнении он выводил содержимое компакт-диска. Это то, что может предоставить ваше ядро ​​или драйвер устройства. В качестве альтернативы система может использоватьexecl(и друзей )для использования /dev/cdromили его содержимого в качестве ключа для запуска другого исполняемого файла (, такого какcat)с этим именем файла.

В любом случае, с соответствующим-execспособным /dev/cdromвы абсолютно сможете запустить эту команду в любой оболочке. Я не знаю ни одной системы, которая ведет себя таким образом, вероятно, по очень веской причине, но теоретически это допустимо и возможно.


POSIX

POSIX требует, чтобы первое слово команды рассматривалось как имя команды, и он определяет, как эта команда должна выполняться:

the shell shall execute the utility in a separate utility environment with actions equivalent to calling the execl() function defined in the System Interfaces volume of POSIX.1-2017 with the path and arg0 arguments set to the command name [...]

If the execl() function fails due to an error equivalent to the [ENOEXEC] error, the shell [...] shall write an error message and shall return an exit status of 126.

Таким образом, соответствующей оболочке не разрешается открывать и печатать файл для данных. Однако нет особой причины, по которой оболочка не могла бы поддерживать такое поведение как расширение, отличное от -POSIX. Я подозреваю, что форма, которую вы предлагаете, имеет серьезные недостатки, но версия zsh в основном хороша.

1
24.09.2021, 09:45
1 ответ

Я перефразирую брошенный -комментарий в качестве ответа, так как автор вопроса говорит, что это решило их проблему.

С этим кодом у меня возникают две проблемы. Не думаю, что их исправление решит проблему отсутствия ssmtp, но, видимо, решает.

  • Удалите оболочку $(... )из последней строки вашего скрипта. Это говорит оболочке использовать выходные данные обернутой команды, и, учитывая то, как вы настроили строку, она попытается ее выполнить. (Если команда не выводит ничего, вы не получите сообщение об ошибке.)

    echo hello
    hello
    
    $(echo hello)
    -bash: hello: command not found
    

    Обычно используется для интерполяции результатов команд в строку или для присвоения их переменной

    a=$(date)
    printf "Today's date is: %s\n" "$(date +%Y-%m-%d)"
    
  • Двойные -кавычки ваших переменных каждый раз, когда вы их используете. Например,

    echo -e "To: $tophil\nSubject: $(hostname) $ip2" | "$mysendmail" "$tophil" 2>&1
    #                                                  ^           ^ ^       ^
    

    В некоторых ситуациях нет строгой необходимости заключать переменные в двойные -кавычки, но так как вы всегда делаете это правильно, проще и безопаснее всегда заключать их в кавычки.

0
25.09.2021, 22:33

Теги

Похожие вопросы