В программе на C у меня есть файловый дескриптор (фактический пример: 14, но, конечно, программа не знает этого заранее), открытый для записи. Я хочу вызвать system(3)
, чтобы что-то запустить и отправить стандартный вывод в этот файловый дескриптор. Конечно, это вызывает /bin/sh
, то есть оболочку Bourne, которая не распознает конструкции вида 1>&14
. Есть ли альтернативный синтаксис (возможно, с использованием фигурных скобок или чего-то еще), который я могу использовать, чтобы оболочка Bourne увидела 14 и использовала его? Я мог бы, конечно, сделать один из них:
Сделайте комбинацию
fork
/exec
вместоsystem(3)
и перенаправьте вручную.Перенаправьте вывод в файл, а затем скопируйте данные из него в файловый дескриптор 14.
Поскольку у меня есть root, пусть
/bin/sh
указывает на Bash.
Самым элегантным способом было бы найти синтаксис, с помощью которого оболочка Bourne будет принимать многозначный номер файлового дескриптора. Есть такой?
ksh93
поддерживает многозначные файловые дескрипторы. Я почти уверен, что вы ссылаетесь на них как1>{14}
и т. д. Так что вполне вероятно, чтоzsh
иbash
также имеют эту функцию. Как вы и просили.. возможно, с помощью брекетов, может быть, вам стоит попробовать? Bourne Shell, определенно не в стандартных версиях, связанных с исходными системами Unix, но кто знает, что вы найдете в более современных версиях, связанных с Linux. (существуют ли настоящие Bourne Shell для Linux?). Удачи. - person shellter   schedule 11.09.20161>&{14}
завершается ошибкой с сообщением об ошибке, а1>{14}
завершается молча. bash использует1>&14
. В то время как в Linux (с которого я мигрирую), я использовал bash в качестве своего/bin/sh
. Похоже, на FreeBSD я сделаю то же самое. Это самый простой способ заставить мой унаследованный код работать гладко. - person Bill Evans at Mariposa   schedule 11.09.2016setvar
. Это ломает основные сценарии оболочки, которые запускаются при загрузке FreeBSD. Итак, вернемся к чертежной доске. Возможно, лучшим решением будет создать функцию C с именем bash_system, которая похожа наsystem(3)
, за исключением того, что она вызывает bash, а не/bin/sh
. - person Bill Evans at Mariposa   schedule 11.09.2016