相关疑难解决方法(0)

如何否定流程的回报价值?

我正在寻找一个简单但跨平台的否定过程来否定过程返回的价值.它应该将0映射到某个值!= 0和任何值!= 0到0,即以下命令应返回"yes,nonexistingpath不存在":

 ls nonexistingpath | negate && echo "yes, nonexistingpath doesn't exist."
Run Code Online (Sandbox Code Playgroud)

的! - 运算符很棒但很遗憾不是shell独立的.

shell cross-platform negate

83
推荐指数
6
解决办法
3万
查看次数

BASH:回显最后一个命令运行

我试图回应在bash脚本中运行的最后一个命令.我找到了一种方法来实现它,history,tail,head,sed当命令代表我的脚本中从解析器角度来看特定行时,它可以正常工作.但是在某些情况下我没有得到预期的输出,例如当命令插入case语句中时:

剧本:

#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"

case "1" in
  "1")
  date
  last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
  echo "last command is [$last]"
  ;;
esac
Run Code Online (Sandbox Code Playgroud)

输出:

Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
Run Code Online (Sandbox Code Playgroud)

[问]有人可以帮我找到一种方法来回显最后一次运行命令,无论在bash脚本中调用此命令的方式/位置如何?

我的答案

尽管我的SO同事非常赞赏,但我选择编写一个run函数 - 它将所有参数作为单个命令运行并在失败时显示命令及其错误代码 …

bash command

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

为什么bash errexit在函数调用中的表现不如预期?

在bash手册页中,它指出:

如果管道(可能包含一个简单的命令),
括在括号中的子shell命令,或者作为括号括起来的命令列表的一部分执行的命令之一,则立即退出...

所以我假设一个函数应该被视为括号括起来的命令列表.但是,如果对函数调用应用条件,则errexit不再在函数体内持久存在,并且在返回之前执行整个命令列表.即使您在为该子shell启用了errexit的函数内显式创建子shell,也会执行命令列表中的所有命令.这是一个演示该问题的简单示例:

function a() { b ; c ; d ; e ; }
function ap() { { b ; c ; d ; e ; } ; }
function as() { ( set -e ; b ; c ; d ; e ) ; }
function b() { false ; }
function c() { false ; }
function d() { false ; }
function e() { false ; }
Run Code Online (Sandbox Code Playgroud)
( set -Eex ; a )
+ a …
Run Code Online (Sandbox Code Playgroud)

bash

9
推荐指数
2
解决办法
5700
查看次数

使用set -e,是否可以忽略某些命令的错误?

我有一个bash脚本,我想全局启用set -e.

但是不是一直禁用它并重新启用它,我想知道是否有一种方法可以选择性地禁用错误处理.例如,从systemd运行的命令可以在减号之前忽略错误.bash有同等效力吗?

例如

#!/bin/bash

set -e

WAN_IF=eth2

# Ignore error on next line
tc qdisc del dev ${WAN_IF} root

# I want errors to stop the script on this line
tc qdisc add dev ${WAN_IF} root handle 1: htb default 10

...
etc
Run Code Online (Sandbox Code Playgroud)

由于需要启用/禁用很多,我不想继续执行以下操作:

set +e
tc qdisc del dev ${WAN_IF} root

# I want errors to stop the script on this line
set -e
tc qdisc add dev ${WAN_IF} root handle 1: htb default 10
...
Run Code Online (Sandbox Code Playgroud)

bash shell

8
推荐指数
1
解决办法
2524
查看次数

如何防止 Bitbucket Pipelines 中的步骤失败?

我正在运行我所有的测试用例,其中一些用例有时会失败,管道检测到它并使步骤和构建失败。这会阻止要执行的下一步(压缩报告文件夹)。我想将该 zip 文件作为电子邮件附件发送。

这是我的 bitbucket-pipelines.yml文件

custom: # Pipelines that can only be triggered manually
  QA2: # The name that is displayed in the list in the Bitbucket Cloud GUI
  - step:
      image: openjdk:8
      caches:
      - gradle
      size: 2x    # double resources available for this step to 8G
      script:
      - apt-get update
      - apt-get install zip
      - cd config/geb
      - ./gradlew -DBASE_URL=qa2 clean BSchrome_win **# This step fails** 
      - cd build/reports
      - zip -r testresult.zip BSchrome_winTest 

      after-script: # On test …
Run Code Online (Sandbox Code Playgroud)

pipeline bitbucket-pipelines

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

bash 中`set -e` 的异常

我有一个用于制作我的项目的 bash 脚本。set -e当任何组件失败时,我在脚本的顶部中断执行。

其中一个命令会失败,但它失败是很自然的。我希望脚本的行为如下:

  • 运行脚本。
  • 到达并运行有问题的命令。
  • 如果失败,不要中断执行。仅针对此命令执行此操作。

bash continuous-integration

0
推荐指数
1
解决办法
603
查看次数

有没有办法在 bash 脚本上切换“set -e”选项?

我有一个脚本,我希望在代码的一个部分出现任何错误时失败,但在另一部分出现错误时继续执行。

我知道“set -e”将实现第一个要求,但是是否可以为脚本“unset -e”,或者忽略特定行或函数的错误?

linux bash

0
推荐指数
1
解决办法
326
查看次数