![OSX:C 程序执行后仍留在终端](https://linux22.com/image/1348272/OSX%EF%BC%9AC%20%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E5%90%8E%E4%BB%8D%E7%95%99%E5%9C%A8%E7%BB%88%E7%AB%AF.png)
第二次编辑
一些澄清...
我编写了一个要求输入的 C 程序(在本例中,使用fgets()
)。当我将其编译为 C 可执行文件时,我注意到以下行为:
如果我从终端运行可执行文件,如下所示:~$ ./program_name
显然,终端会话在该过程完成后将继续。像往常一样,我看到一个空白的命令行:~$
但是,如果我通过双击 C 可执行文件来运行可执行文件,则会出现一个终端,我可以按照程序的要求输入数据。输入数据后,进程结束,显示“终端”,[Process completed]
并且终端显然无法使用。
当我在 OSX 中运行允许终端输入的 C 可执行文件(fgets()
例如通过)时,输入信息后会出现消息[Process completed]
,并且终端似乎无法使用。这对于我的目的来说很不方便。
问题: 假设我在没有打开终端的情况下运行它。所以我双击了该程序。
有没有办法在执行 C 程序后留在终端通过命令行输入?
- 我的程序要求输入,所以我可以给它输入可以
echo
在 shell 中输入的内容... 有什么方法/命令可以保留在终端中吗?生成一个新的终端是一种选择,但它远的不太理想。
- 我的程序要求输入,所以我可以给它输入可以
有没有办法留在终端通过改变我的 C 程序?
附加问题: 是否有一个终端命令可以生成一个新的终端窗口?
欢迎提出各种想法...!我有一些想法,但还没有令人满意的。
答案1
[Process completed]
是终端会话结束时(即不再有与 tty 关联的进程)终端写入终端显示的内容。这表示程序已退出,并且您没有从交互式 shell 启动终端会话。
有多种方法可以在终端中执行命令而无需手动与 shell 交互,其中包括:
选择Shell > 新命令菜单项并输入命令。离开在 shell 中运行命令复选框未选中。您的程序将直接执行,无需 shell。如果您打开 Inspector 窗口并查看 Info 窗格,您将看到进程列表仅列出“login”和您的命令,但没有 shell。
从 Finder打开一个
*.command
文件。终端将启动一个 shell 并告诉它执行命令文件,然后退出。您将看到一个 shell 提示符,后面跟着一个命令,如下所示:/path/to/your/file.command ; exit;
。同样,如果您查看检查器,进程列表将包括“登录”、您的 shell 和您的命令可执行文件。(如果您选择在 shell 中运行命令在里面新命令控制板。)
听起来你正在使用 #2。没有办法改变你的程序,让 shell 在程序退出后保持交互;但是,有几种间接的方法可以让终端运行命令,然后为你留下一个交互式 shell:
创建一个在交互式 shell 中运行命令的设置配置文件:
- 在首选项 > 设置使用配置文件列表底部的操作(齿轮)菜单复制默认配置文件。
- 前往壳窗格并选择运行命令:。
- 输入命令文件的路径名。
- 选择在 shell 中运行。
*.terminal
使用以下方式将设置配置文件导出到文件:出口命令,或者将其从配置文件列表拖到 Finder。
然后,每当您想要创建一个通过运行程序启动的新 shell 时,请打开该
*.terminal
文件。您也可以在终端内使用此配置文件打开一个新终端,方法是使用外壳 > 新窗口[或 Tab] 菜单,或者双击配置文件列表中的配置文件。编写一个 AppleScript,指示终端运行您的命令,就像您将其输入到命令行一样。然后,您可以将脚本存储在系统范围的脚本菜单中并从那里调用它,也可以将脚本保存为可以运行的应用程序。例如,该脚本如下所示:
tell application "Terminal" activate do script "/path/to/your/file.command" end tell