Я хочу свою программу foo
принять входные данные из файла Shebang. Этот файл состоит из строки shebang, за которой следует текст:
#!/usr/bin/env foo
food_for_foo
more_food_for_foo
я хочу foo
прочитать этот текст (игнорируя первую строку), а затем перейти в интерактивный режим.
я думал так foo
получит содержимое файла на stdin
поэтому я написал это, чтобы прочитать из этого. Но когда я выполняю вышеупомянутый файл Шебанга, foo
запускается и сразу становится интерактивным, игнорируя все входные данные из файла shebang.
Как правильно получить содержимое скрипта?
Вы не получаете содержимое скрипта через 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';
}
}
должен выводить содержимое скрипта построчно. Вы бы хотели игнорировать первую строку (возможно, обобщив это на любую строку, начинающуюся с #
чтобы разрешить комментарии в сценарии) и делать все, что вы делаете с остальными строками.
Путь к сценарию с шебангом передается в качестве параметра команды 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)
или как то так 🙂
Входной скрипт может содержать первую строку Шебанга, а может и не содержать.