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