Проверьте аргументы командной строки UNIX, каналы и перенаправления из программы на C - PullRequest
2 голосов
/ 07 февраля 2010

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

Если я, например, использую вызов scanf, он будет работать с перенаправлением или каналом из оболочки, но в отсутствие этого я получаю приглашение, которое мне не нужно.

Я хотел бы принять аргументы командной строки через argv [], канал или перенаправление, но я не могу понять, как это сделать без получения приглашения. Если я, например, попробую что-то вроде этого:

if(argc < 2)
    exit(0);

Тогда программа прекратит работу, если я попробую это:

echo arg | myProgram

Или это:

myProgram < fileWithArgument

Я пытался найти это, но я всегда получаю некоторые ссылки на скрипты bash.

Ответы [ 3 ]

7 голосов
/ 07 февраля 2010

Обычный способ справиться с подобными ситуациями - проверить, подключен ли стандартный поток ввода к терминалу или нет, используя isatty или аналогичные функции в зависимости от вашей ОС. Если это так, вы берете параметры из командной строки, если нет (они были перенаправлены), вы читаете стандартный ввод.

2 голосов
/ 07 февраля 2010

Короткая версия: Вы не можете этого сделать.

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

Нейл дал вам способ определить, подключены ли вы к терминалу .

0 голосов
/ 07 февраля 2010

В ваших примерах вы используете перенаправление каналов, и echo arg | myProgram, и myProgram < filesWithArguments отправляют вывод на STDIN вашей программы.

Если вы хотите прочитать эти значения, используйте scanf или fread в дескрипторе файла STDIN .

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

# This will pass `lala` as a variable
myProgram `echo lala`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...