2014-12-17 7 views
0

Я хочу, чтобы моя программа foo принимала входные данные из файла shebang. Этот файл состоит из притон линии с последующим текстом:Как передать содержимое файла «shebang» в программу, которую он вызывает?

#!/usr/bin/env foo 
food_for_foo 
more_food_for_foo 

Я хочу foo читать этот текст (не обращая внимание на первую строку), а затем интерактивно.

Я думал, что foo получит содержимое файла по адресу stdin, поэтому я написал его для чтения. Но когда я выполняю вышеуказанный файл shebang, начинается foo и сразу переходит в интерактивный режим, игнорируя все входные данные из файла shebang.

Каков правильный способ получить содержимое скрипта?

+2

для начала, покажите нам 'foo()'. –

+0

После переформулировки вопроса должно быть ясно, что речь идет не о деталях кодирования 'foo'. –

ответ

3

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

Например:

#include <iostream> 
#include <fstream> 
#include <string> 

int main(int argc, char * argv[]) { 
    std::ifstream script(argv[1]); 
    std::string line; 
    while (std::getline(script, line)) { 
     std::cout << line << '\n'; 
    } 
} 

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

+0

Нет, не полностью – user3159253

+0

@ user3159253: Что значит? –

+0

Первая строка входных данных должна быть проверена для shebang и пропущена, если это – user3159253

3

Путь к скрипту с shebang передается в качестве параметра команды в foo. Таким образом, foo должен проверить свои аргументы и обработать их соответственно (предположительно, игнорируя первую строку, если это shebang.)

Вот небольшой скрипт на языке питона для демонстрации вещей (я слишком ленив, чтобы реализовать его как программу на C/C++, проверить @ пример MikeSeymour для что):

#!/usr/bin/env python 
import sys 
if len(sys.argv) > 1: 
    print("processing startup data from %s" % sys.argv[1]) 
    with open(sys.argv[1], 'rb') as startup: 
     first = startup.readline() 
     if not first.startswith("#!"): 
      print("startup input data '%s'" % first) 
     for l in startup.readlines(): 
      print("startup input data '%s'" % l) 
print("performing regular operations...") 
for l in sys.stdin.readlines(): 
    print("handling regular interactive input line '%s'" % l) 

или что-то вроде этого :)

сценарий ввода может содержать первый притон линию или нет.