Как кормить содержимое «шебанга» файл в программу, которую он вызывает?

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

#!/usr/bin/env foo
food_for_foo
more_food_for_foo

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

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

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

0

Решение

Вы не получаете содержимое скрипта через 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';
}
}

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

3

Другие решения

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

Вот небольшой скрипт на python для демонстрации вещей (мне лень реализовывать его как программу на 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)

или как то так 🙂

Входной скрипт может содержать первую строку Шебанга, а может и не содержать.

3

По вопросам рекламы [email protected]