OSX:C程序执行后保留在终端中


0

第二次编辑

一些澄清......

我写了一个要求输入的C程序(在这种情况下,使用fgets())。当我将它编译成C可执行文件时,我注意到这种行为:

如果我从终端运行可执行文件:~$ ./program_name显然终端会话在进程完成后继续。像往常一样,我遇到一个空白的命令行:~$

但是,如果我通过双击C可执行文件来运行可执行文件,则会出现一个终端,我可以输入数据,如程序所要求的那样。在输入数据之后,过程结束,“终端”说[Process completed],并且终端显然不可用。

当我在OSX中运行允许终端输入的C可执行文件(fgets()例如,通过)时,在输入信息后,将[Process completed]显示该消息,并且终端似乎无法使用。这对我的目的来说很不方便。

问题: 我们假设我在没有终端打开的情况下运行它。所以我双击程序。

  • 通过命令行输入执行C程序后,有没有办法留在终端?

    • 我的程序要求输入,所以我可以给它输入可以echo在shell中...是否有任何方式/命令留在终端?产生一个新的终端是一种选择,但它是远远不希望的。
  • 有没有办法通过改变我的C程序留在终端

附加问题: 是否有终端命令产生新的终端窗口?

欢迎所有想法......!我有一些,但没有什么令人满意的。


“通过命令行输入执行C程序”是什么意思?第二种情况,从终端发布?您是该计划的开发者,还是由第三方编写的?
Daniel Beck

@DanielBeck我的意思是:~$ ./program_name两者兼而有之:我在一本书中读到它,实现它,并遇到了这个没有讨论过的行为。
d0rmLife 2013年

Answers:


0

[Process completed]是终端会话结束时终端写入终端显示的内容,即没有更多与tty相关联的进程。这表示您的程序已退出,并且您没有从交互式shell启动终端会话。

有几种方法可以在终端中执行命令而无需手动与shell进行交互,包括:

  1. 选择Shell> New Command菜单项并输入命令。将Run命令保留在未选中的shell复选框。您的程序将在没有shell的情况下直接执行。如果打开Inspector窗口并查看Info窗格,您将看到进程列表仅列出“login”和您的命令,但没有shell。

  2. *.command从Finder 打开文件。终端将启动一个shell并告诉它执行命令文件然后退出。您将看到一个shell提示符,后跟一个类似于的命令:/path/to/your/file.command ; exit;。同样,如果查看Inspector,进程列表将包括“login”,shell和命令可执行文件。(如果在“ 新建命令”面板中的shell中选择“运行”命令,也会发生这种情况。)

听起来你正在使用#2。程序退出后,无法更改程序以使shell保持交互; 但是,有几种间接方式让终端运行命令,然后给你一个交互式shell:

  1. 创建在交互式shell中运行命令的设置配置文件:

    1. “首选项”>“设置”中,使用配置文件列表底部的操作(齿轮)菜单复制默认配置文件。
    2. 转到Shell窗格,然后选择Run command : .
    3. 输入命令文件的路径名。
    4. 选择Run in shell
    5. 将设置配置*.terminal文件导出到文件,可以使用操作菜单中的“ 导出”命令,也可以将其从配置文件列表拖动到Finder。

    然后,每当您想要创建一个通过运行程序启动的新shell时,请打开该*.terminal文件。您也可以使用Shell> New Window [或Tab]菜单或通过双击配置文件列表中的配置文件,从Terminal内部使用此配置文件打开一个新终端。

  2. 编写一个指示终端运行命令的AppleScript,就好像您已将其输入命令行一样。然后,您可以将脚本存储在系统范围的“脚本”菜单中并从那里调用它,也可以将脚本保存为可以运行的应用程序。脚本看起来像这样,例如:

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

我澄清了我的问题:我正在回应命令,所以我不确定* .command。第二个2很有意思。我从未使用AppleScript,但如果你提供的命令在语法上是正确的,那么它看起来非常简单。
d0rmLife 2013年

此外,AppleScript可以用于调用C程序而不是* .command文件吗?
d0rmLife 2013年

如果您使用AppleScript(或实际上,任何可以发送Apple Events的语言)向终端发送“do script”事件,则终端只会将文本发送到tty,就像您输入了一样。因此,您可以让它执行您可以输入的任何命令,甚至可以输入不是命令的文本(例如,输入编辑器的文本或其他类型的程序的数据)。
克里斯·佩奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.