【问题标题】:Exit causes root logout if script user executes the script outside of the script directory如果脚本用户在脚本目录之外执行脚本,退出会导致 root 注销
【发布时间】:2019-04-12 10:08:54
【问题描述】:

Bash 脚本错误用户在退出时退出根目录

我有一个大的 Bash 脚本,如果某些用户输入无效,它需要退出脚本并重新启动它。我遇到了一个奇怪的错误,如果用户确实在脚本所在目录之外执行了脚本,他就会从 root 中注销。但是如果脚本是在脚本所在目录中执行的,则不会出现这种情况。

我已经尝试移除出口,但这只会让事情变得更糟。

#!/bin/bash

some_function() {

      read -p "Enter something: "

      # Some commands

      if [[ $? -gt 0 ]]; then
            echo "error"
            . /whatever/location/script.sh && exit 1
      fi

}

预期的结果是,脚本只是重新启动并退出用户运行的进程。实际结果是这样的,但如果脚本在此之后终止,用户将退出 root。

【问题讨论】:

  • 顺便说一句,检查$? 的零/非零值是错误的形式,因为任何设置$? 的命令都可能直接是if 的主体。代替something; if [ $? -eq 0 ],使用if something; then,或者反过来使用if ! something; then

标签: bash root exit logout


【解决方案1】:

您没有这么说,但您似乎正在采购包含该退出函数的脚本。如果您正在采购它,那么就好像每个命令都是在命令行中键入的......所以 exit 将注销您正在运行的任何 shell。

对于始终来源的脚本,请使用 return 而不是 exit

如果您不知道是否会获取脚本,则需要检测它并根据调用方式选择适当的行为。例如:

some_function() {
  read -p "Enter something: "
  # Some commands
  if [[ $? -gt 0 ]]; then
      echo "error"
      if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
        # sourced
        . /whatever/location/script.sh && return 1
      else
        # not sourced
        . /whatever/location/script.sh && exit 1
      fi
  fi
}

【讨论】:

  • 抱歉,我的回复晚了,这个解决方案有效。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2018-10-14
  • 2017-01-19
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多