Оболочка C: Как выполнить программу с аргументами не из командной строки? - PullRequest
2 голосов
/ 22 октября 2008

Мой $ SHELL - это tcsh. Я хочу запустить скрипт оболочки c, который будет вызывать программу много раз с некоторыми измененными аргументами каждый раз. Программа, которую мне нужно вызвать, находится на Фортране. Я не хочу редактировать это. Программа принимает аргументы только после выполнения, но не в командной строке. После вызова программы в сценарии программа берет на себя управление (это то место, где я застрял в настоящее время, я никогда не смогу выйти, потому что сценарий не будет выполнять ничего до тех пор, пока процесс программы не остановится); в этот момент мне нужно передать ему некоторые переменные, затем после нескольких итераций мне нужно будет выйти из программы ctrl-c и продолжить работу со сценарием.

Как это можно сделать?

Ответы [ 6 ]

5 голосов
/ 22 октября 2008

Чтобы добавить к тому, что сказал @Toybuilder, вы можете использовать «здесь документ». То есть ваш скрипт может иметь

./myfortranprogram << EOF
first line of input
second line of input
EOF

Все между "<<EOF" и "EOF" будет подано на стандартный ввод программы (Фортран все еще использует "read (5, *)" для чтения со стандартного ввода?)

И потому что я думаю, что комментарий @ ephemient заслуживает того, чтобы быть в ответе:

Еще несколько советов: << 'EOF' предотвращает интерполяция в теле документа; << - EOF удаляет все ведущие вкладки (так Вы можете сделать отступ здесь документ, чтобы соответствовать его окружение), и EOF может быть заменен на любой токен. Пустой токен (<< "") указывает здесь-документ, который останавливается в первой пустой строке. </p>

Я не уверен, насколько они переносимы, или если они просто расширения tcsh - я сам использовал только «1014» типа «здесь документ».

2 голосов
/ 22 октября 2008

То, что вы хотите использовать: Ожидайте .

1 голос
/ 22 октября 2008

Хм, вы можете перенаправить ваш код на Фортране? Вы можете создать временный файл с вашими данными и затем передать его с помощью перенаправления stdin (<). </p>

0 голосов
/ 29 марта 2016

Меня послали сюда после того, как мне сказали, что мой вопрос был почти дубликатом этого вопроса.

FWIW, у меня была похожая проблема со сценарием оболочки csh C.

Этот бит кода позволял выполнению команды custom_command без получения ЛЮБЫХ входных аргументов:

foreach f ($forecastTimes)
    custom_command << EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
        EOF
end

Это не сработало в первый раз, когда я попробовал, но после того, как я удалил все пробелы в этом разделе кода, я удалил пробел между "<<" и "EOF". Я также отодвинул закрывающее «EOF» до левого поля. После этого все заработало: </p>

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
0 голосов
/ 22 октября 2008

Это работа для ожидаемой программы Unix, которая может легко и просто интерактивно управлять программами и отвечать на их запросы.

0 голосов
/ 22 октября 2008

Не tcsh пользователь, но если программа запускается, то читает команды через stdin, тогда вы можете использовать перенаправление оболочки < для подачи необходимых команд. Если вы запустите его в фоновом режиме с &, вы не будете блокировать его выполнение. Затем вы можете sleep немного, затем использовать любые инструменты, которые у вас есть (ps, grep, awk и т. Д.), Чтобы узнать PID программы, а затем использовать kill, чтобы отправить ее SIGTERM так же, как делать Ctrl-C.

...