2-е редактирование

Некоторые уточняющие ...

Я написал программу на C, которая запрашивает ввод (в этом случае, используя fgets()). Когда я компилирую его в исполняемый файл C, я замечаю такое поведение:

Если я запускаю исполняемый файл из терминала, например: ~$ ./program_name очевидно, сеанс терминала продолжается после завершения процесса. Меня приветствует пустая командная строка, как обычно: ~$

Однако, если я запускаю исполняемый файл двойным щелчком по исполняемому файлу C, появляется терминал, и я могу вводить данные, как и просит программа. После ввода данных процесс завершается, "терминал" сообщает [Process completed] и терминал, по-видимому, непригоден для использования.

Когда я запускаю исполняемый файл C в OSX, который позволяет вводить данные с терминала (например, через fgets() ), после ввода информации появляется сообщение [Process completed] , и терминал кажется непригодным для использования. Это неудобно для моих целей.

Вопросы: Давайте предположим, что я запускаю его без открытого терминала.Так что я дважды щелкаю по программе.

  • Есть ли способ остаться в терминале после выполнения C-программы с помощью ввода из командной строки?

    • Моя программа запрашивает ввод, так что я могу дать ему ввод, который может echo в оболочке ... есть ли способ / команда остаться в терминале? Нерест нового терминала является вариантом, но это гораздо менее желательно.
  • Есть ли способ остаться в терминале , изменив мою C-программу?

Дополнительный вопрос: есть ли команда терминала для вызова нового окна терминала?

Все идеи приветствуются ...! У меня есть немного, но пока ничего удовлетворительного.

1 ответ1

0

[Process completed] - это то, что Терминал записывает на дисплей терминала после завершения сеанса терминала, т. Е. Больше нет процессов, связанных с tty. Это означает, что ваша программа завершилась, и вы не запустили сеанс терминала из интерактивной оболочки.

Есть несколько способов выполнить команду в Терминале без взаимодействия с оболочкой вручную, в том числе:

  1. Выберите пункт меню « Оболочка»> «Новая команда» и введите команду. Оставьте флажок « Выполнить внутри оболочки» не установленным. Ваша программа будет выполнена напрямую без оболочки. Если вы откроете окно Инспектора и посмотрите на панель «Информация», вы увидите в списке процессов только списки «вход» и вашу команду, но без оболочки.

  2. Откройте файл *.command из Finder. Терминал запустит оболочку и скажет ей выполнить командный файл, а затем завершится. Вы увидите приглашение оболочки, за которым следует команда, которая выглядит следующим образом: /path/to/your/file.command ; exit; , Опять же, если вы посмотрите на Inspector, список процессов будет включать «login», вашу оболочку и исполняемый файл вашей команды. (Это также происходит, если вы выберете команду «Выполнить» внутри оболочки на панели « Новая команда» .)

Похоже, вы используете # 2. Невозможно изменить вашу программу, чтобы оболочка оставалась интерактивной после ее выхода; однако есть несколько косвенных способов заставить терминал выполнить команду и затем оставить вас с интерактивной оболочкой:

  1. Создайте профиль настроек, который запускает вашу команду в интерактивной оболочке:

    1. В разделе "Настройки"> "Настройки" продублируйте профиль по умолчанию, используя меню действий (шестеренка) внизу списка профилей.
    2. Перейдите на панель оболочки и выберите команду "Выполнить":.
    3. Введите путь к вашему командному файлу.
    4. Выберите Запустить внутри оболочки.
    5. Экспортируйте профиль настроек в файл *.terminal либо с помощью команды « Экспорт» в меню действий, либо путем перетаскивания его из списка профилей в Finder.

    Затем, когда вы захотите создать новую оболочку, которая запускается при запуске вашей программы, откройте файл *.terminal . Вы также можете просто открыть новый терминал с этим профилем изнутри терминала, либо используя меню "Оболочка"> "Новое окно" [или Tab], либо дважды щелкнув профиль в списке профилей.

  2. Напишите AppleScript, который предписывает Терминалу выполнить вашу команду, как если бы вы вводили его в командную строку. Затем вы можете либо сохранить сценарий в общесистемном меню "Сценарий" и вызвать его оттуда, либо сохранить сценарий как приложение, которое вы можете запустить. Сценарий будет выглядеть так, например:

    tell application "Terminal"
        activate
        do script "/path/to/your/file.command"
    end tell
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .