Существует ли оболочка POSIX, которая полностью устраняет необходимость в `cat` и `dd` с помощью операторов на месте?

Чтобы быстро создать файл подготовки к удаленному резервному копированию всех моих домашних сценариев. Я использую следующее:

# Scripts backup
ls ~/*.sh | cpio -ov | 7z a -si ~/Documents/SCRIPT_BACKUP_30062017.cpio.7z
# Scripts restore
7z x -so ~/Documents/SCRIPT_BACKUP_30062017.cpio.7z | cpio -iv   

Причина, по которой я не делаю резервную копию своего «домашнего» корня, заключается в том, что я специально синхронизирую и отправляю только некоторые каталоги. Обратите внимание, как cpio будет пропускать и проверять наличие более новых существующих файлов при восстановлении. Это мощно. Ваша работа не будет перезаписана.

бутон@

1
20.08.2019, 03:34
1 ответ

зш:

</dev/cdrom >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 в основном хороша.

5
27.01.2020, 23:15

Теги

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