return bash 的值 shell
return value of bash shell
我正在尝试学习 linux bash 脚本。我有一个脚本,我想获取此脚本的 return 值并将其存储在一个变量中。
欢迎任何帮助。
提前谢谢你。
#!/bin/bash
HOST_NAME=
{ echo "105" ; sleep 5; } | telnet $HOST_NAME 9761;
?
变量始终存储上一个命令的退出代码。
您可以使用 $?
检索值。
$?
shell 变量存储 return 值,但是对于 Linux telnet
客户端,这可能没有您想象的那么有用。如果远程主机关闭连接(或发生任何远程或网络错误),客户端将 return 1
如果本地客户端成功关闭连接,则客户端将 0
。问题是许多服务被编写为发送数据然后自己关闭 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
。如果您想要远程脚本的 return 值,使用 ssh
会更容易,如下所示:
$ ssh ssh.tardis.ed.ac.uk "exit 5"
THE TARDIS PROJECT | pubpubpubpubpubpubpubpubpub | Authorised access only
$ echo $?
5
据我所知,telnet 唯一一次 return 为零(即成功)是在您逃脱并且完全是客户端时,如下所示:
$ telnet www.google.com 80
Trying 216.58.210.36...
Connected to www.google.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
$ echo $?
0
希望对您有所帮助。
为避免混淆,不要 think/talk 将其视为 return 值,请将其视为退出状态。
在大多数编程语言中,您可以通过捕获变量中的任何函数 return 来捕获函数的 return 值,例如使用类似 C 的语言:
int foo() {
printf("35\n");
return 7;
}
void main() {
int var;
var=foo();
}
调用 foo()
后 main()
中的变量 var
将保存值 7
并且 35
将打印到标准输出。在 shell 中,但使用类似的代码:
foo() {
printf "35\n"
return 7
}
main() {
local var
var=$(foo)
}
var
将具有值 35
和未提及的内置变量 $?
始终保存最后一个命令的退出状态 运行 的值为 7
。如果你想复制 C 行为,其中 35 转到 stdout 而 var 包含 7 那么那将是:
foo() {
printf "35\n"
return 7
}
main() {
local var
foo
var=$?
}
事实上 shell 函数使用关键字 return
来报告它们的退出状态,如果您习惯于其他基于 Algol 的语言(如 C),那么一开始会感到困惑,但如果它们使用 exit
然后它会终止整个过程,所以他们不得不使用一些东西,很快就会明白它的真正含义。
因此,当涉及 shell 脚本和函数时,使用词 "output" 和 "exit status",而不是 "return",某些人在某些情况下会认为这意味着其中任何一个两件事,这将避免所有混乱。
顺便说一句,为了避免让事情变得更复杂,我在上面说过 $?
是一个变量,但它实际上是 "special parameter" ?
的值。如果您现在真的想了解差异,请参阅 https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters 讨论 shell 参数,其中包括 "special parameters",如 ?
和 #
,"positional parameters" 像 1
和 2
,"variables" 像我上面的脚本中使用的 HOME
和 var
。
这取决于你所说的 return 价值.
进程(在类 UNIX 系统上)可以 return 将 shell 单个无符号字节作为退出状态,以便给出 0-255 范围内的值。按照惯例,零表示成功,任何其他值表示失败。
(在 C 等低级语言中,您可以获得的不仅仅是此退出状态,但在 bash
中不可见)。
最后一个命令的退出状态 运行 存储在变量 ?
中,因此您可以从 $?
中获取它的值,但是由于许多程序只 return 0(有效)或 1(无效),没什么用。
Bash
条件,如 if
和 while
测试成功(退出代码为 0)或失败(退出代码为非零):
if some-command
then
echo "It worked"
else
echo "It didn't work"
fi
不过....
如果你的意思是你想从脚本中得到输出,那就另当别论了。您可以使用以下方式捕获它:
var=$(some-command)
但是等等,它只捕获正常输出,路由到名为 stdout
的流(文件描述符 1),它不会捕获大多数程序写入名为 stderr
的流的错误消息(文件描述符 2).要同时捕获错误,您需要将文件描述符 2 重定向到文件描述符 1:
var=$(some-command 2>&1)
输出文本现在在变量 var
中。
我正在尝试学习 linux bash 脚本。我有一个脚本,我想获取此脚本的 return 值并将其存储在一个变量中。
欢迎任何帮助。
提前谢谢你。
#!/bin/bash
HOST_NAME=
{ echo "105" ; sleep 5; } | telnet $HOST_NAME 9761;
?
变量始终存储上一个命令的退出代码。
您可以使用 $?
检索值。
$?
shell 变量存储 return 值,但是对于 Linux telnet
客户端,这可能没有您想象的那么有用。如果远程主机关闭连接(或发生任何远程或网络错误),客户端将 return 1
如果本地客户端成功关闭连接,则客户端将 0
。问题是许多服务被编写为发送数据然后自己关闭 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
。如果您想要远程脚本的 return 值,使用 ssh
会更容易,如下所示:
$ ssh ssh.tardis.ed.ac.uk "exit 5"
THE TARDIS PROJECT | pubpubpubpubpubpubpubpubpub | Authorised access only
$ echo $?
5
据我所知,telnet 唯一一次 return 为零(即成功)是在您逃脱并且完全是客户端时,如下所示:
$ telnet www.google.com 80
Trying 216.58.210.36...
Connected to www.google.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
$ echo $?
0
希望对您有所帮助。
为避免混淆,不要 think/talk 将其视为 return 值,请将其视为退出状态。
在大多数编程语言中,您可以通过捕获变量中的任何函数 return 来捕获函数的 return 值,例如使用类似 C 的语言:
int foo() {
printf("35\n");
return 7;
}
void main() {
int var;
var=foo();
}
调用 foo()
后 main()
中的变量 var
将保存值 7
并且 35
将打印到标准输出。在 shell 中,但使用类似的代码:
foo() {
printf "35\n"
return 7
}
main() {
local var
var=$(foo)
}
var
将具有值 35
和未提及的内置变量 $?
始终保存最后一个命令的退出状态 运行 的值为 7
。如果你想复制 C 行为,其中 35 转到 stdout 而 var 包含 7 那么那将是:
foo() {
printf "35\n"
return 7
}
main() {
local var
foo
var=$?
}
事实上 shell 函数使用关键字 return
来报告它们的退出状态,如果您习惯于其他基于 Algol 的语言(如 C),那么一开始会感到困惑,但如果它们使用 exit
然后它会终止整个过程,所以他们不得不使用一些东西,很快就会明白它的真正含义。
因此,当涉及 shell 脚本和函数时,使用词 "output" 和 "exit status",而不是 "return",某些人在某些情况下会认为这意味着其中任何一个两件事,这将避免所有混乱。
顺便说一句,为了避免让事情变得更复杂,我在上面说过 $?
是一个变量,但它实际上是 "special parameter" ?
的值。如果您现在真的想了解差异,请参阅 https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters 讨论 shell 参数,其中包括 "special parameters",如 ?
和 #
,"positional parameters" 像 1
和 2
,"variables" 像我上面的脚本中使用的 HOME
和 var
。
这取决于你所说的 return 价值.
进程(在类 UNIX 系统上)可以 return 将 shell 单个无符号字节作为退出状态,以便给出 0-255 范围内的值。按照惯例,零表示成功,任何其他值表示失败。
(在 C 等低级语言中,您可以获得的不仅仅是此退出状态,但在 bash
中不可见)。
最后一个命令的退出状态 运行 存储在变量 ?
中,因此您可以从 $?
中获取它的值,但是由于许多程序只 return 0(有效)或 1(无效),没什么用。
Bash
条件,如 if
和 while
测试成功(退出代码为 0)或失败(退出代码为非零):
if some-command
then
echo "It worked"
else
echo "It didn't work"
fi
不过....
如果你的意思是你想从脚本中得到输出,那就另当别论了。您可以使用以下方式捕获它:
var=$(some-command)
但是等等,它只捕获正常输出,路由到名为 stdout
的流(文件描述符 1),它不会捕获大多数程序写入名为 stderr
的流的错误消息(文件描述符 2).要同时捕获错误,您需要将文件描述符 2 重定向到文件描述符 1:
var=$(some-command 2>&1)
输出文本现在在变量 var
中。