请原谅我基本的 unix/linux 脚本编写能力和糟糕的英语
我正在 Linux VM 中测试一个脚本,假设它是work.sh
.所以我必须 ssh 到虚拟机
ssh [email protected]
有了我的访问权限,那么我需要在我的主文件夹中运行脚本
[[email protected] ~]. work.sh param1 param2
当批处理脚本中出现问题时,我可以看到错误,但也会被踢出 VM/ssh 会话
Connection to [email protected] closed.
所以我必须重新登录。
我尝试了 nohup,但我也喜欢将任何错误/日志输出到控制台。处理这种情况的更好方法是什么
答案1
听起来set -e
剧本里有一个。如果源脚本(使用 运行. scriptname
)在启用该设置的情况下抛出错误,则关闭 shell 将是预期的行为。
如果没有对脚本的任何了解,我不能肯定地说您不应该运行它,.
但这是一种不寻常的做事方式。
我会尝试运行它:
./work.sh param1 param2
如果您试图克服丢失的执行位阻止您运行脚本的问题,您可以尝试:
$SHELL ./work.sh param1 param2
或者,您可以启动一个额外的 shell 并像现在一样运行——这可能会让您看到一条错误消息
$SHELL
. work.sh param1 param2
答案2
有了我的访问权限,那么我需要在我的主文件夹中运行脚本
[[email protected] ~]. work.sh param1 param2
有两种调用脚本的方法:“正常调用”和“点调用”或“采购”:
$ /path/to/executable
$ . /path/to/executable
区别在于:第一个变体将使操作系统启动一个新进程(shell 的子进程),加载并执行其中的脚本,当如此加载的脚本结束其运行时,该进程将再次关闭 - 然后您又回到了您的 shell 进程很可能会向您显示另一个提示。
第二种变体的行为类似,但有一个重要的区别:没有创建子进程,但脚本在当前进程。我不确定work.sh
会发生什么(如果您想发表评论,您应该发布其内容),但我怀疑它会以某种方式离开您的登录 shell,这就是导致断开连接的原因。不要以前面的点开始,您很可能不会再遇到断开连接的情况。
奖金信息
根据我的经验,当初学者可以通过一些实验来观察某件事的效果时,他们学得最好、最快。所以这里是:
您可以通过编写以下脚本并将其另存为“my_script.sh”来查看点执行和正常执行之间的区别:
#!/bin/bash
my_x="abc"
my_y="def"
不要忘记使其可执行(chmod 754 my_script.sh
)并以正常方式执行脚本,然后显示两个定义变量的内容:
$ ./my_script.sh
$ echo $my_x $my_y
您将看到的效果是:什么也没有——变量没有设置。原因很简单:在脚本开始时启动了另一个进程,发生了变量的定义那里当流程关闭时,它们再次消失,因为它们是那环境,不是你的。
现在使用点执行运行相同的脚本:
$ . ./my_script.sh
$ echo $my_x $my_y
abc def
您会注意到,这次确实设置了变量:原因是脚本不是在某个新进程中执行,而是在您的进程中执行 - 因此变量定义发生在您的环境中,并且随后仍然存在。