我正在寻找一个简单但跨平台的否定过程来否定过程返回的价值.它应该将0映射到某个值!= 0和任何值!= 0到0,即以下命令应返回"yes,nonexistingpath不存在":
 ls nonexistingpath | negate && echo "yes, nonexistingpath doesn't exist."
的! - 运算符很棒但很遗憾不是shell独立的.
我试图回应在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
输出:
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]"]
[问]有人可以帮我找到一种方法来回显最后一次运行命令,无论在bash脚本中调用此命令的方式/位置如何?
我的答案
尽管我的SO同事非常赞赏,但我选择编写一个run函数 - 它将所有参数作为单个命令运行并在失败时显示命令及其错误代码 …
在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 ; }
( set -Eex ; a )
+ a …我有一个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
由于需要启用/禁用很多,我不想继续执行以下操作:
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
...
我正在运行我所有的测试用例,其中一些用例有时会失败,管道检测到它并使步骤和构建失败。这会阻止要执行的下一步(压缩报告文件夹)。我想将该 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 …我有一个用于制作我的项目的 bash 脚本。set -e当任何组件失败时,我在脚本的顶部中断执行。
其中一个命令会失败,但它失败是很自然的。我希望脚本的行为如下:
我有一个脚本,我希望在代码的一个部分出现任何错误时失败,但在另一部分出现错误时继续执行。
我知道“set -e”将实现第一个要求,但是是否可以为脚本“unset -e”,或者忽略特定行或函数的错误?