【问题标题】:How can I run a command only after some other commands have run successfully?只有在其他一些命令成功运行后,如何才能运行命令?
【发布时间】:2011-12-06 16:33:43
【问题描述】:

在 bash 中,如果我希望命令 B 仅在命令 A 成功后运行,我知道我应该使用 &&

A && B

但是如果我希望 D 仅在 ABC 全部成功后运行怎么办? 是

 'A&B&C' && D

好吗?

另外,如果我想知道ABC中哪个命令失败了该怎么办(因为它们会运行很多次,如果我一个一个检查会需要一段时间)。

是否有可能在任何命令失败后立即将错误信息自动输出到文本文件?

就我而言,ABCcurlBrm,我的脚本是这样的:

for f in * 
do 
    curl -T server1.com
    curl -T server2.com
    ...
    rm $f
done

【问题讨论】:

  • 如果A 失败,您要运行BC 吗?只要任何命令失败,A && B && C && D 就会退出。但是,如果您想无条件地运行ABC,然后仅在它们都成功时运行D,那么请参阅@Adam 的答案。 (不,A&B&C && D 不会做你想做的事;单个 & 会导致命令在后台运行。)
  • 可以用括号吗?

标签: linux bash


【解决方案1】:

试试这个:

A; A_EXIT=$?
B; B_EXIT=$?
C; C_EXIT=$?
if [ $A_EXIT -eq 0 -a $B_EXIT -eq 0 -a $C_EXIT ]
then
  D
fi

变量A_EXITB_EXITC_EXIT 告诉您ABC 命令中的哪一个(如果有)失败。您可以在每个命令之后在额外的if 语句中输出到文件,例如

A; A_EXIT=$?
if [ $A_EXIT -ne 0 ]
then
  echo "A failed" > text_file
fi

【讨论】:

  • 谢谢你的帮助,你能说出“$”是什么吗?是什么意思?我好像经常在bash脚本中遇到它,但是在google里搜不到
  • $?是 shell 的特殊变量,它保存最后一个前台命令的状态。搜索这些东西的一个好地方是 bash 手册页:linux.die.net/man/1/bash
【解决方案2】:

为什么不将你的命令存储在一个数组中,然后对其进行迭代,当一个失败时退出?

#!/bin/bash

commands=(
    [0]="ls"
    [1]="ls .."
    [2]="ls foo"
    [3]="ls /"
)

for ((i = 0; i < 4; i++ )); do
    ${commands[i]}
    if [ $? -ne 0 ]; then
        echo "${commands[i]} failed with $?"
        exit
    fi
done

【讨论】:

    【解决方案3】:

    您可以通过执行 i.e 从上一个命令中获得返回

    命令;回声$?

    1 = 失败 0 = 成功

    以更结构化的格式,例如:

    cat /var/log/secure
      if [ $? -ne "1" ] ; then
        echo "Error" ; exit 1
      fi
    

    【讨论】:

      【解决方案4】:

      如果命令成功或失败,有条件地做某事(根据this StackExchange 的回答)

      if command ; then
          echo "Command succeeded"
      else
          echo "Command failed"
      fi
      

      您可以开发这个简单的代码来执行多个 if 条件,并让您知道哪个命令失败。

      这可能不是问题的完美答案,但认为它可能对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 2021-11-07
        相关资源
        最近更新 更多