我正在尝试编写一个 C 程序来打开单独的终端并 ping google.com
#include<stdio.h>
#include <string.h>
int main()
{
char command[50];
strcpy(command,"gnome-terminal -e 'sh -c "ping -c4 google.com"'");
system(command);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
但它只显示这样的错误消息
c2.c: 在函数 'main' 中:c2.c:9:43: 错误:在 'ping' strcpy(command,"gnome-terminal -e 'sh -c "ping -c4 google.com" 之前预期的 ')' '");
我该如何解决这个问题?
您要么必须转义内部双引号:
strcpy(command, "gnome-terminal -e 'sh -c \"ping -c4 google.com\"'");
Run Code Online (Sandbox Code Playgroud)
或者直接ping在终端中运行命令,没有封闭的外壳:
strcpy(command, "gnome-terminal -e 'ping -c4 google.com'");
Run Code Online (Sandbox Code Playgroud)
请注意,这两种变体都会在ping命令退出后立即关闭终端窗口,因为它们都不会启动交互式 shell。
如果您希望终端保持打开状态并能够输入命令,则必须在ping退出后启动交互式 shell 。我不知道您为什么选择sh(/bin/dash在 Ubuntu中指向)而不是具有更多功能的标准 Bash shell,但这并不重要。你可以这样做:
strcpy(command, "gnome-terminal -e 'sh -c \"ping -c4 google.com ; sh\"'");
Run Code Online (Sandbox Code Playgroud)
如果您只是希望窗口在收到击键之前保持打开状态(不允许输入命令但在您按下任何键时立即退出),您可以read在您的之后运行 Bash 的命令ping,例如像这样:
strcpy(command, "gnome-terminal -e 'bash -c \"ping -c4 google.com ; read -s -n1\"'");
Run Code Online (Sandbox Code Playgroud)
这将抑制输入的键在终端中回显并在第一个输入字符后返回,而不是等待Enter键。有关在 Bash shell 中read键入的更多信息help read。
请注意,这在sh(Dash) 中不起作用,因为read它特定于 Bash。