2010-11-14 2 views
2

Я знаю, что программа C обычно заканчивается возвратом, где мы возвращаем статус программы. Однако я хочу вернуть строку. Причина в том, что я буду вызывать C-исполняемый файл из сценария оболочки и печатать возвращенную строку. Есть ли какой-либо механизм для того же самого?Механизм возврата строки из программы C main()

+0

Просто добавьте. Один из способов - записать строку во временный файл и прочитать/удалить ее из сценария оболочки. Но я хочу избежать таких вещей, поскольку строка будет паролем. –

+0

См. Нижнюю часть моего комментария об использовании паролей в сценариях оболочки. –

ответ

9

Не существует такого механизма; ожидается, что код возврата будет байтом. Если вы хотите вывести строку из вашей программы, то используйте что-то вроде printf() и подстановку команд в сценарии оболочки для ее захвата.

+0

Спасибо большое ... Это сработало. Однако нужно ли нам принимать какие-либо меры предосторожности для того же? Это для производства, как утилита. –

+0

Я не понимаю ваш вопрос. –

+0

Хорошо, на самом деле функциональность, о которой я говорил выше, будет реализован. Так, хотелось бы знать, если я пойду с подходом «printf», будут ли какие-либо проблемы, которые вы могли бы предвидеть. –

7

Вы не можете.

Лучшее, что вы могли бы сделать, это записать строку где-нибудь (на стандартный вывод, стандартную ошибку или некоторый файл); то shellscript получит вашу строку оттуда.

Стандартный выход (таким образом, используя только printf), вероятно, является лучшим решением, так как это будет очень легко из программы C напечатать строку, и очень легко для shellscript получать эти данные:

От сценария оболочки :

STRING="$(./your_program argv1 argv2)" 
5

Существует нет способа вернуть строку из main(). Может быть, сама программа должна печатать строку?

4

Просто введите строку, которую вы хотите вернуть к стандартным выводам, с помощью printf. Затем в сценарии, сделать что-то вроде этого:

SOMESTRING="`./yourprogram`" 

кавычку будет фиксировать выход программы, которая будет строка, которую вы распечатаны.

1

Вы не можете, но вам также не нужно. Вы возвращаете код stat из основного, но вы всегда можете перенаправить вывод и зафиксировать его в своем сценарии оболочки.

0

Вы не можете - вы можете вернуть целое число.

Помните, что C был разработан вместе с Unix. Программы Unix возвращают целочисленное значение, которое предназначено как код состояния. Если программа должна была возвращать строку (строки), она записывала бы их в stdout, а затем пользователь (или скрипт) подключал бы ее к чему-то полезному.

MS DOS также имеет значения статуса только для числа.

0

Вы должны напечатать строку stdout и использовать подстановки команд командного интерпретатора, чтобы прочитать результат:

"`command`" 

или:

"$(command)" 

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

output="$(command ; echo x)" 
output="${output%x}" 

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

wget "http://$user:[email protected]/foo" 

попробовать что-то вроде

wget -i - << EOF 
http://$user:[email protected]/foo 
EOF 

Здесь-файлы, как в этом примере, могут быть использованы с рядом программ, которые нужно принимать пароли из сценариев.

Смежные вопросы