2016-09-10 6 views
1

В программе C у меня есть файловый дескриптор (фактический пример: 14, но, конечно, программа не знает этого заранее) открыта для записи. Я хочу позвонить system(3), чтобы запустить что-то и отправить его стандартный вывод в этот файловый дескриптор. Конечно, это вызывает /bin/sh, который является оболочкой Bourne, которая не распознает конструкции вида 1>&14. Есть ли альтернативный синтаксис (возможно, с помощью скобок или что-то еще), который я могу использовать, чтобы оболочка Bourne увидела 14 и использовала его? Я, конечно, могу сделать один из них:Bourne shell: как перенаправить на многозначный fd?

  1. Делает fork/exec комб вместо system(3) и перенаправлять вручную.

  2. Перенаправление вывода в файл, а затем скопировать данные из него в файл с дескриптором 14.

  3. Поскольку у меня есть корень, есть /bin/sh пункт Bash.

Самый элегантный способ - обнаружить синтаксис, с помощью которого оболочка Bourne будет принимать многозначный номер дескриптора файла. Есть такие?

+1

Я точно знаю, что более новая версия 'ksh93' поддерживает многозначные файловые дескрипторы. Я уверен, что вы ссылаетесь на них как на «1> {14}» и т. Д. Поэтому кажется, что 'zsh' и' bash' также имеют эту функцию. Как вы спросили «.. возможно, используя брекеты», может быть, вы должны попробовать? Bourne Shell, определенно не в стандартных версиях, связанных с оригинальными системами Unix, но которые знают, что вы найдете в более современных версиях, связанных с Linux. (есть ли настоящая Bourne Shell для Linux?). Удачи. – shellter

+0

Для оболочки bourne (которую я использую с FreeBSD, я никогда не встречал ее с Linux), '1> & {14}' fail с сообщением об ошибке, а '1> {14}' терпит неудачу. bash использует '1> & 14'. Хотя в Linux (из которого я переношу), я использовал bash как свой '/ bin/sh'. Похоже, на FreeBSD я сделаю то же самое. Это самый простой способ сделать мой старый код работать плавно. –

+0

Хороший материал. Спасибо за отзывы/информацию. Похоже, вы решили решение, рад, что вы можете двигаться вперед. Всем удачи! – shellter

ответ

1

Рассмотрите мои любимые правила оптимизации: (1) Не оптимизируйте. (2) Для экспертов: пока не оптимизируйте.

Ситуация, возникающая в вопросе, будет (для меня) возникнуть в коде, который будет выполняться не более 100 раз в день. Этого достаточно:

sprintf(big_string, 
     "bash -c \"somethingsomething 1>&%d\"", 
     the_fd 
     );