相关疑难解决方法(0)

更正Bash和shell脚本变量大小写

我遇到了许多带有变量的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 shell scripting naming-conventions capitalization

171
推荐指数
5
解决办法
5万
查看次数

在Bash脚本中引发错误

我想在Bash脚本中引发错误,消息"Test cases Failed !!!".在Bash中如何做到这一点?

例如:

if [ condition ]; then
    raise error "Test cases failed !!!"
fi
Run Code Online (Sandbox Code Playgroud)

linux error-handling bash shell

84
推荐指数
5
解决办法
6万
查看次数

什么是一些bash脚本中使用的'function'关键字?

例如: Bash-Prog-Intro-HOWTO

function foo() {}

我进行搜索查询info bash并查看POSIX的相关章节中的函数关键字,但没有找到.

什么是function一些bash脚本中使用的关键字?这是一些不赞成的语法吗?

bash

59
推荐指数
3
解决办法
1万
查看次数

忽略shell脚本中的特定错误

我有一个shell脚本的小片段,有可能抛出许多错误.我有脚本当前设置为全局停止所有错误.不过我希望这个小小节略有不同.

这是片段:

recover database using backup controlfile until cancel || true; 
auto
Run Code Online (Sandbox Code Playgroud)

我期待这最终会抛出"找不到文件"错误.但是,我想继续执行此错误.对于任何其他错误,我希望脚本停止.

实现这一目标的最佳方法是什么?

Bash版本3.00.16

error-handling bash shell

48
推荐指数
2
解决办法
6万
查看次数

如何显示使用bash set -e时失败的最后一个命令?

set -e用来在第一次错误时停止执行脚本.

问题是,这并没有告诉我出了什么问题.

如何更新bash脚本以便它显示最后一个失败的命令?

bash

17
推荐指数
2
解决办法
3286
查看次数

如何递归测试目录下的所有包装箱?

有些项目包括多个包,这使得在每个包中手动运行所有测试变得麻烦.

是否有一种方便的递归运行方式cargo test

testing rust rust-cargo

13
推荐指数
2
解决办法
424
查看次数

如何判断bash脚本中的任何命令是否失败(非零退出状态)

我想知道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 exit-code sh exitstatus

13
推荐指数
1
解决办法
3912
查看次数

如何获取失败的Bash命令的实际行号?

在提出一种在我的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)

bash

8
推荐指数
2
解决办法
3825
查看次数

有没有办法在退出时执行命令(无论脚本如何退出)?

我有一个脚本写出临时文件,以帮助执行.在我的脚本结束时,我只是打电话rm filename来清理我创建的临时文件.问题是脚本因错误而中断或被中断时.在这些情况下,rm永远不会达到语句,因此永远不会清除文件.有没有办法我可以指定一些命令在退出时运行,无论它是否成功退出?

bash exit

5
推荐指数
2
解决办法
828
查看次数

Shell脚本在出错时打印行号

我一直在寻找一种在shell脚本出错时打印行号的方法.

我遇到了'-x'选项,它在运行shell脚本时打印该行,但这不是我想要的.也许我可以在每个退出代码之前做$ LINENO?有更清洁的方法吗?

我只想要行号,这样我就可以打开shell脚本并直接转到解释器实现错误的地方.

bash shell scripting

5
推荐指数
1
解决办法
3019
查看次数

检查命令是否成功使 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)

bash shell

5
推荐指数
2
解决办法
3171
查看次数

如何在bash中"尝试做某事然后检测它是否失败"?

在回答上一个问题时:

我怎样才能使用'我有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 if-statement try-catch

4
推荐指数
1
解决办法
6562
查看次数

如何使bash函数在任何错误上返回1

我有一个假的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 exit-code

4
推荐指数
2
解决办法
3995
查看次数