尝试运行 bash 时如何处理错误?

尝试运行 bash 时如何处理错误?

想象一个具有标准 bash linux 脚本的脚本(在 SUSE linux 上运行)。像这样:

#!/bin/bash
#version=1.0
#Some other text
command
#-------Comment

Changeversion=2.0
...
...

有什么方法可以自动处理错误或至少说一条自定义消息?例如,我将尝试运行脚本,但它显示:

-bash: ./filename.sh: Keine Berechtigung

所以我必须为该文件添加权限 - 有没有办法在尝试运行该文件时自动为该文件添加权限,或者至少添加“自定义消息”,如“do chmod +x filename.sh”?

或者如果我有不同的编码:

/bin/bash^M: bad interpreter:

脚本本身可以运行这个命令吗:

sed -i -e 's/\r$//' filename.sh

或者至少在错误信息中说出来?

答案1

我复制了你的问题:

# cat /tmp/tmp 
#!/bin/bash
echo SCRIPT BASH EXECUTED

# file /tmp/tmp
/tmp/tmp: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

# /tmp/tmp 
-bash: /tmp/tmp: /bin/bash^M: bad interpreter: No such file or directory

以下命令解决了执行该命令的 bash 会话的问题:

# trap 'file $BASH_COMMAND |grep -qs "Bourne-Again shell script, ASCII text executable, with CRLF line terminators" && sed -i -e "s/\r$//" $(echo $BASH_COMMAND|cut -d" " -f1) && echo "DOS FORMAT BASH SCRIPT, SED EXECUTED" && $BASH_COMMAND' ERR
# /tmp/tmp testArgument1 testArgument2
-bash: /tmp/tmp: /bin/bash^M: bad interpreter: No such file or directory
DOS FORMAT BASH SCRIPT, SED EXECUTED
SCRIPT BASH EXECUTED

# /tmp/tmp testArgument1 testArgument2
SCRIPT BASH EXECUTED

命令 trap 仅对当前会话有效,将其放入 /etc/profile /etc/profile.d 或一些类似的配置文件中,以使其对所有 bash 会话持久有效。

我仅在 RHEL 7 系统上使用 bash-4.2.46-19.el7.x86_64 进行了测试

答案2

这个问题被否决了,但没有人解释原因(反对者真丢脸!)所以我来解释为什么我要否决(是的,这应该是一条评论,但它有点太大了)。

虽然这些对于您实现运行代码的目标来说似乎无关紧要,但它们的存在是有充分理由的。在计算机上运行代码本质上是危险的。显然,除非计算机运行代码,否则计算机就没有多大用处,但重要的是让计算机运行正确的代码。实现常见错误的自动修复有 2 个重大影响:

  • 这使得攻击你计算机的人更容易在你的机器上执行他们的代码
  • 有时人们会输入错误的命令 - 也许你的神奇脚本修复系统会修复并执行错误的代码

此外,有时错误并不像表面上看起来的那样 - 您可能具有访问脚本的文件系统权限,但该脚本可能位于noexec已安装的文件系统上,或者访问可能被 SELinux 阻止。或者 Apparmour。或者 GRSecurity。

一个特定的错误消息并不等同于一个特定的解决方案。

相关内容