bash - bash shell的telnet返回值

142 5

我正在尝试学习 linux bash脚本。 我有一个脚本,我想获得此脚本的返回值,并且,将它存储在变量中。

欢迎任何帮助。

先 谢谢 你 了.


#!/bin/bash


HOST_NAME=$1



{ echo"105" ; sleep 5; } | telnet $HOST_NAME 9761;



时间: 原作者:

137 1

为避免混淆,不要将它视为返回值,将它视为 - 退出状态。

在大多数编程语言中,您可以通过捕获函数在变量中返回的内容来捕获函数的返回值,例如:使用类C语言,


int foo() {


 printf("35n");


 return 7;


}



void main() {


 int var;


 var=foo();


}



调用 foo()main() 中的变量 var 将保存值 735 将被打印到 stdout 。 在 shell 中,使用类似的代码:


foo() {


 printf"35n"


 return 7


}



main() {


 local var


 var=$(foo)


}



var 将拥有 35 和unmentioned内置变量 $?,它始终保持最后一个命令运行的退出状态,它的值为 7 。 如果要复制 35到stdout的C 行为,而var包含 7,那么这个行为:


foo() {


 printf"35n"


 return 7


}



main() {


 local var


 foo


 var=$?


}



事实上 shell 函数使用关键字 return 来报告它们的退出状态,如果你习惯了其他基于Algol的语言,比如C, 但是如果他们使用了 exit 那么我终止了整个过程,所以他们必须快速使用它变得明显它真正意味着什么 。

因此在使用 shell 脚本和函数时请使用"output"和"exit status"这两个词而不是"return", 某些上下文中的某些人会假设这些2个事件中的任何一个, 这将避免所有混淆 。

顺便说一下,我在上面说,$? 是一个变量,但是它实际上是"特殊参数" ?的值。 如果你真的想立即了解差异,那么请参阅 https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters 讨论 shell 参数,包括"特殊参数"如 ? 和 #"位置参数"如 1 和 2"变量"如 HOME 和 var , 如上面的脚本所示 。

原作者:
120 1

$? shell 变量存储返回值,但是对于 Linux telnet 客户端, 这可能没有你想象的那么有用 。 如果远程主机关闭连接( 或者发生任何远程或网络错误) 和 0,客户端将返回 1 如果本地客户端端成功关闭连接,则返回。 问题在于编写了许多服务,以便它们发送数据然后自己关闭TCP连接, 而无需等待客户端:


$ telnet time-b.timefreq.bldrdoc.gov 13


Trying 132.163.96.2...


Connected to time-b-b.nist.gov.


Escape character is '^]'.



58600 19-04-27 13:56:16 50 0 0 736.0 UTC(NIST) *


Connection closed by foreign host.


$ echo $?


1



即使客户端向服务器发送命令以便退出TCP流,这仍然会导致远程端关闭连接,结果相同,


$ telnet mail.tardis.ed.ac.uk 25


Trying 193.62.81.50...


Connected to isolus.tardis.ed.ac.uk.


Escape character is '^]'.


220 isolus.tardis.ed.ac.uk ESMTP Postfix (Debian/GNU)


QUIT


221 2.0.0 Bye


Connection closed by foreign host.


$ echo $?


1



所以无论你怎么做,你都会得到一个 1 。 如果想要远程脚本的返回值,那么使用 ssh 就更容易了:


$ ssh ssh.tardis.ed.ac.uk"exit 5"


THE TARDIS PROJECT | pubpubpubpubpubpubpubpubpub | Authorised access only


$ echo $?


5



据我所知,telnet唯一会返回零(即 success)如果你按escape退出客户端, 就像这样:


$ telnet www.google.com 80


Trying 216.58.210.36...


Connected to www.google.com.


Escape character is '^]'.


^]



telnet> quit


Connection closed.


$ echo $?


0



希望这有帮助

原作者:
...