как узнать, была ли моя C-программа вызвана через shebang? - PullRequest
0 голосов
/ 13 марта 2019

Я создал небольшой интерпретатор команд (в C ++), который можно вызывать либо напрямую, либо в сценарии с помощью shebang (#!). Он может принимать аргументы в командной строке (в моем коде они обозначены как argc / argv).

Проблема в том, что при вызове через shebang сам скрипт передается в мою программу в качестве аргумента 1. Это проблематично; Я не хочу, чтобы мой командный интерпретатор пытался обработать сценарий, из которого он был вызван. Но я не вижу простого способа узнать, когда это так.

РЕДАКТИРОВАТЬ: Например, если у меня есть скрипт с именем «test», который начинается с #! / Usr / local / bin / miniscript, а затем вызывается как . / Test --help -c -foo , я получил 5 аргументов в своем C-коде: / usr / local / bin / miniscript, ./test, --help, -c и -foo. Если я вызываю его напрямую, я получаю четыре аргумента: / usr / local / bin / miniscript, --help, -c и -foo

Как я могу узнать, когда моя программа была вызвана с помощью shebang, или узнать, как пропустить аргумент, представляющий скрипт, которым она была вызвана?

1 Ответ

0 голосов
/ 13 марта 2019

Мой вопрос основан на неверном предположении.Я считал, что при вызове программы с помощью shebang происходит две вещи:

  1. В качестве первого аргумента передается путь к этой программе.
  2. Содержимое этой программы передается на стандартный ввод.

Так что я по существу беспокоился о том, чтобы обработать контент дважды.Но только пункт 1 верен;Пункт 2 не происходит (как отмечают полезные комментаторы на мой вопрос).Поэтому, если код C принимает имя файла для обработки в качестве первого аргумента и игнорирует любую начальную строку, начинающуюся с шебанга, то все в порядке с миром.

...