Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中将分号检测为命令行参数 我试图运行一个C++应用程序,在这里我将一些命令行参数传递给它: ./startServer -ip 10.78.242.4 tcpip{ldap=no;port=2435}_C++_Command Line_Command Line Arguments - Fatal编程技术网

在linux中将分号检测为命令行参数 我试图运行一个C++应用程序,在这里我将一些命令行参数传递给它: ./startServer -ip 10.78.242.4 tcpip{ldap=no;port=2435}

在linux中将分号检测为命令行参数 我试图运行一个C++应用程序,在这里我将一些命令行参数传递给它: ./startServer -ip 10.78.242.4 tcpip{ldap=no;port=2435},c++,command-line,command-line-arguments,C++,Command Line,Command Line Arguments,应用程序正在崩溃,因为它无法获得正确的端口。在网上搜索时,我发现“;”被视为命令结束字符(),因此之后的所有内容都被忽略。我也明白把它放在引号里会很好。但是,我不想强制将参数放在用户的引号中。因此,我想知道是否有一种方法可以用argv数组处理“;”字符?分号分隔两个命令,因此命令行相当于 ./startServer -ip 10.78.242.4 tcpip{ldap=no port=2435} 您的应用程序永远不会知道分号或第二个命令的任何信息,这些信息将完全由shell处理。您需要用反斜杠

应用程序正在崩溃,因为它无法获得正确的端口。在网上搜索时,我发现“;”被视为命令结束字符(),因此之后的所有内容都被忽略。我也明白把它放在引号里会很好。但是,我不想强制将参数放在用户的引号中。因此,我想知道是否有一种方法可以用argv数组处理“;”字符?

分号分隔两个命令,因此命令行相当于

./startServer -ip 10.78.242.4 tcpip{ldap=no
port=2435}
您的应用程序永远不会知道分号或第二个命令的任何信息,这些信息将完全由shell处理。您需要用反斜杠转义冒号,或者用引号将其括起来。可能导致类似问题的其他字符包括:
$,\-\\``:*?()&


从文件或通过stdin传递复杂字符串要容易得多。

分号分隔两个命令,因此命令行相当于

./startServer -ip 10.78.242.4 tcpip{ldap=no
port=2435}
您的应用程序永远不会知道分号或第二个命令的任何信息,这些信息将完全由shell处理。您需要使用反斜杠对冒号进行转义,或将其括在引号中。可能导致类似问题的其他字符包括:
$,\-“:?()&

从文件或通过stdin传递复杂字符串要容易得多。

您不仅需要引用
但在一般情况下,
{
}

./startServer -ip 10.78.242.4 'tcpip{ldap=no;port=2435}'
如果您的用户需要输入复杂的最后一个参数,那么也可以让他们引用它。

您不仅需要引用
但在一般情况下,
{
}

./startServer -ip 10.78.242.4 'tcpip{ldap=no;port=2435}'


如果您的用户需要输入复杂的最后一个参数,那么也可以让他们引用它。

为什么需要分号作为分隔符?在linux的命令行中使用没有特定意义的东西不是更简单吗?将其屏蔽为\;也不是一种选择吗?问题似乎是,分号甚至没有传递给您的程序,因此您可以在argv数组中处理它。如果您要屏蔽它,那么它将被传递,并且您可以处理它。另外,shell将“吃掉”它也可以这样做,但我只是想知道我们是否能检测到上面命令中的“;”。你不能对一个应用程序这样做。也许你可以用
stty
来更改它,但是一行可以包含任意数量的命令来启动不同的进程(这些进程都有不同的参数)。“把它放在引号中就可以了。但是,我不想强制这个限制”为什么不,对于复杂的参数来说,这是一个相当标准和公认的做法。为什么需要分号作为分隔符?在linux的命令行中使用没有特定意义的东西不是更简单吗?将其屏蔽为\;也不是一种选择吗?问题似乎是,分号甚至没有传递给您的程序,因此您可以在argv数组中处理它。如果您要屏蔽它,那么它将被传递,并且您可以处理它。另外,shell将“吃掉”它也可以这样做,但我只是想知道我们是否能检测到上面命令中的“;”。你不能对一个应用程序这样做。也许你可以用
stty
来更改它,但是一行可以包含任意数量的命令来启动不同的进程(这些进程都有不同的参数)。“把它放在引号中就可以了。但是,我不想强制这个限制”为什么不,对于复杂的参数来说,这是一个非常标准和公认的方法。有没有方法访问第二行“port=2435}”?它们实际上存放在哪里?我在argv数组中找不到它。不,第二行与您的进程无关,shell将尝试将其作为第二个命令运行,该命令将变量“port”设置为“2345}”,您也无法访问该变量,因为它只是一个shell变量,而不是环境变量,并且只会在您的进程退出后进行设置。我明白了。我甚至运行了./startServer-ip10.78.242.4'tcpip{ldap=no;port=2435}';ls,并在进程退出后运行“ls”命令。如果有人运行一些有害的命令(如rm),该怎么办?有没有办法防止这种情况发生?是的,never,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,Every,向命令行shell传递不受信任的输入,而不进行清理,例如,但是当我无法访问“;”之后?它们实际上存放在哪里?我在argv数组中找不到它。不,第二行与您的进程无关,shell将尝试将其作为第二个命令运行,该命令将变量“port”设置为“2345}”,您也无法访问该变量,因为它只是一个shell变量,而不是环境变量,并且只会在您的进程退出后进行设置。我明白了。我甚至运行了./startServer-ip10.78.242.4'tcpip{ldap=no;port=2435}';ls,并在进程退出后运行“ls”命令。如果有人运行一些有害的命令(如rm),该怎么办?有没有办法防止这种情况发生?是的,决不,决不,决不,决不,决不,决不,决不,决不,决不,决不将不受信任的输入传递到命令行shell,而不对其进行清理,例如,但当我无法访问“;”之后的命令行参数时,如何清理参数列表?