зш:
myfile.iso
будет делать это только с операторами (, если не в sh
эмуляции ). Тем не менее, он по-прежнему выполняет команду $NULLCMD
(cat
по умолчанию ), чтобы выполнять фактическое чтение и запись.
Предлагаемый вами синтаксис
/dev/cdrom > myfile.iso
на самом деле может работать теперь в любой оболочке POSIX, потому что это не обязательно связано с оболочкой вообще.
Требуется, чтобы /dev/cdrom
был исполняемым и чтобы при выполнении он выводил содержимое компакт-диска. Это то, что может предоставить ваше ядро или драйвер устройства. В качестве альтернативы система может использоватьexecl
(и друзей )для использования /dev/cdrom
или его содержимого в качестве ключа для запуска другого исполняемого файла (, такого какcat
)с этим именем файла.
В любом случае, с соответствующим-exec
способным /dev/cdrom
вы абсолютно сможете запустить эту команду в любой оболочке. Я не знаю ни одной системы, которая ведет себя таким образом, вероятно, по очень веской причине, но теоретически это допустимо и возможно.
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 в основном хороша.
Я перефразирую брошенный -комментарий в качестве ответа, так как автор вопроса говорит, что это решило их проблему.
С этим кодом у меня возникают две проблемы. Не думаю, что их исправление решит проблему отсутствия 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
# ^ ^ ^ ^
В некоторых ситуациях нет строгой необходимости заключать переменные в двойные -кавычки, но так как вы всегда делаете это правильно, проще и безопаснее всегда заключать их в кавычки.