我遇到了许多带有变量的shell脚本,我一直认为存在严重的误解.我的理解是,按照惯例(也许很久以前就必须),环境变量都是全部的.
但是在像Bash这样的现代脚本环境中,我总是倾向于使用临时变量的小写名称约定,而仅为导出(即环境)变量使用大写的约定.例如:
#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"
Run Code Online (Sandbox Code Playgroud)
这一直是我对事物的看法.是否有任何权威来源同意或不同意这种方法,还是纯粹是风格问题?
我想在Bash脚本中引发错误,消息"Test cases Failed !!!".在Bash中如何做到这一点?
例如:
if [ condition ]; then
raise error "Test cases failed !!!"
fi
Run Code Online (Sandbox Code Playgroud)
function foo() {}
我进行搜索查询info bash并查看POSIX的相关章节中的函数关键字,但没有找到.
什么是function一些bash脚本中使用的关键字?这是一些不赞成的语法吗?
我有一个shell脚本的小片段,有可能抛出许多错误.我有脚本当前设置为全局停止所有错误.不过我希望这个小小节略有不同.
这是片段:
recover database using backup controlfile until cancel || true;
auto
Run Code Online (Sandbox Code Playgroud)
我期待这最终会抛出"找不到文件"错误.但是,我想继续执行此错误.对于任何其他错误,我希望脚本停止.
实现这一目标的最佳方法是什么?
Bash版本3.00.16
我set -e用来在第一次错误时停止执行脚本.
问题是,这并没有告诉我出了什么问题.
如何更新bash脚本以便它显示最后一个失败的命令?
有些项目包括多个包,这使得在每个包中手动运行所有测试变得麻烦.
是否有一种方便的递归运行方式cargo test?
我想知道bash脚本中的任何命令是否以非零状态退出.
我想要类似于set -e功能的东西,除了当命令以非零状态退出时我不希望它退出.我想让它运行整个脚本,然后我想知道:
a)所有命令以退出状态0退出
-
或- b)一个或多个命令以非零状态退出
例如,给出以下内容:
#!/bin/bash
command1 # exits with status 1
command2 # exits with status 0
command3 # exits with status 0
Run Code Online (Sandbox Code Playgroud)
我想要运行所有三个命令.运行脚本后,我想要一个指示,即至少有一个命令以非零状态退出.
在提出一种在我的Bash脚本中捕获错误的方法的过程中,我一直在试验"set -e","set -E"和"trap"命令.在这个过程中,我发现了一些奇怪的行为,如何$LINENO在函数的上下文中进行评估.首先,这是我正在尝试记录错误的简化版本:
#!/bin/bash
set -E
trap 'echo Failed on line: $LINENO at command: $BASH_COMMAND && exit $?' ERR
Run Code Online (Sandbox Code Playgroud)
现在,根据故障发生的位置,行为会有所不同.例如,如果我遵循以上内容:
echo "Should fail at: $((LINENO + 1))"
false
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
Should fail at: 6
Failed on line: 6 at command: false
Run Code Online (Sandbox Code Playgroud)
一切都如预期.第6行是包含单个命令"false"的行.但是如果我将失败的命令包装在一个函数中并像这样调用它:
function failure {
echo "Should fail at $((LINENO + 1))"
false
}
failure
Run Code Online (Sandbox Code Playgroud)
然后我得到以下输出:
Should fail at 7
Failed on line: 5 at command: false
Run Code Online (Sandbox Code Playgroud)
如您所见,$BASH_COMMAND包含正确的失败命令:"false",但是$LINENO将"失败"函数定义的第一行报告为当前命令.这对我来说毫无意义.有没有办法获得引用的行号$BASH_COMMAND?
这种行为可能特定于旧版本的Bash.我暂时停留在3.2.51.如果在以后的版本中行为发生了变化,那么知道是否有一种解决方法可以获得我想要的值3.2.51仍然是一件好事.
编辑:我害怕有些人感到困惑,因为我把我的例子分成了几块.让我试着澄清一下我拥有什么,我得到了什么,以及我想要什么.
这是我的脚本:
#!/bin/bash …Run Code Online (Sandbox Code Playgroud) 我有一个脚本写出临时文件,以帮助执行.在我的脚本结束时,我只是打电话rm filename来清理我创建的临时文件.问题是脚本因错误而中断或被中断时.在这些情况下,rm永远不会达到语句,因此永远不会清除文件.有没有办法我可以指定一些命令在退出时运行,无论它是否成功退出?
我一直在寻找一种在shell脚本出错时打印行号的方法.
我遇到了'-x'选项,它在运行shell脚本时打印该行,但这不是我想要的.也许我可以在每个退出代码之前做$ LINENO?有更清洁的方法吗?
我只想要行号,这样我就可以打开shell脚本并直接转到解释器实现错误的地方.
我正在编写一个 shell 安装脚本
在每个命令之后我需要检查命令是否成功 - 我必须通知用户失败的原因。
如果出现故障 - 安装无法继续,目前在我添加的每个命令之后
if [ $? -eq 0 ]; then
Run Code Online (Sandbox Code Playgroud)
但这会为 shell 脚本的每个命令添加 6 行,
有没有办法缩短此检查的时间?
样本:
do some command
if [ $? -eq 0 ]; then
echo notify user OK
else
echo notify user FAIL
return -1
fi
do some command
if [ $? -eq 0 ]; then
echo notify user OK
else
echo notify user FAIL
return -1
fi
Run Code Online (Sandbox Code Playgroud) 在回答上一个问题时:
我怎样才能使用'我有root权限吗?' 作为bash的条件?
建议"尝试做某事并检测是否失败"而不是"检查权限然后做某事"
我发现了很多理由,例如:
但是,我发现很少有关于如何在bash中实现try/catch的明确信息.我猜它太容易了,除了我发现的东西看起来相当复杂 - 使用函数或其他脚本:
我对bash相对比较新,但我觉得没有类似于try其他语言中的函数的简单函数.
具体来说,我想做以下事情:
CMD=`./path/to/script.sh`
if [ <echo $CMD | grep error is true> ]; then
.. do this ..
else
.. do that ..
fi
Run Code Online (Sandbox Code Playgroud) 我有一个假的bash函数,如:
has_error() {
true
echo "Ok..."
false
echo "Shouldn't be here!"
}
Run Code Online (Sandbox Code Playgroud)
当我运行此函数并检查错误状态时,我希望发生什么:
> has_error; echo $?
Ok...
1
Run Code Online (Sandbox Code Playgroud)
但实际发生了什么:
> has_error; echo $?
Ok...
Shouldn't be here!
0
Run Code Online (Sandbox Code Playgroud)
问题是该函数在抛出错误后继续执行,而且,我甚至无法检测到抛出了错误.我怎么能改变这个?我可以set -e在函数的开头放一个,但是如果抛出错误,我的整个shell都会终止.我想要的是简单地让它返回并将退出状态设置为1.我可以&&通过插入命令之间或通过后缀每一行来完成它|| return 1,但这些都不是很优雅.这样做的正确方法是什么?
编辑:
似乎我不够清楚,因为很多回复似乎表明我实际上并不知道如何在bash中执行测试.正如我上面提到的,我知道我可以在我的函数中手动测试每个命令,并根据需要返回或处理错误.我也知道我可以set -e并且导致我的shell会话因错误而终止.但我要问的是:有没有办法让函数停止继续执行 - 没有明确的测试 - 如果该函数中的任何命令返回非零状态?
bash ×12
shell ×5
exit-code ×2
scripting ×2
exit ×1
exitstatus ×1
if-statement ×1
linux ×1
rust ×1
rust-cargo ×1
sh ×1
testing ×1
try-catch ×1