【问题标题】:What is the difference between using && or typing the second command on the next line in bash script? [duplicate]使用 && 或在 bash 脚本的下一行输入第二个命令有什么区别? [复制]
【发布时间】:2019-01-30 05:00:52
【问题描述】:

例如,

for files in ../parentdir/*data.txt
do
    command1 > output.txt && mv output.txt $path
done

对比,

for files in ../parentdir/*data.txt
do
    command1 > output.txt
    mv output.txt $path
done

对比

for files in ../parentdir/*data.txt
do
    command1 > output.txt | mv output.txt $path
done

这些脚本的流程有什么不同吗?如果我的 command1(使用我无法更改的程序)首先创建 output.txt 文件并在完成之前不断添加/编辑文件,我如何确保一旦 output.txt 完全完成我可以安全地将文件移动到正确的目录?如果 output.txt 文件名在完成后无论如何都改变了,这会容易得多,但不幸的是它没有。

【问题讨论】:

    标签: bash boolean-logic


    【解决方案1】:

    && 将导致第二个命令仅在第一个命令成功时执行。

    基本相同:

    command1
    if [ $? = 0 ] ; then
        command2
    fi
    

    (其中$?command1 的退出值,成功时应为零)

    【讨论】:

    • 另一种写法:if command1; then command2; fi
    • (...Wiimm 提出的后者是更好的做法——检查$? 会导致错误,就像有人添加echo 用于日志记录并且没有意识到他们正在改变稍后发生的条件的行为)。
    • 如何使用管道“|”代替 && ?这是否也意味着无论 command1 是否失败,mv 命令都会执行?
    【解决方案2】:

    使用&& 时,如果第一个命令失败,第二个命令将永远不会执行。

    在您的第二个变体中,无论您的第一个命令的结果如何,第二个命令都将始终执行。

    想法,使第二个命令的执行依赖于第一个命令的结果:如果尚未创建 output.txt,则不能移动它。

    【讨论】:

    • 那么当我看到我的文件有时不动时,这意味着第一部分刚刚失败。有趣,不知道为什么会失败。我必须检查一下。
    • 但是当文件首先被创建但东西被添加到它时,它会自动移动文件怎么办?我正在使用一个程序,该程序将首先创建文件并在进行各种分析时不断添加/编辑文件。如何克服这个问题?
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2017-09-04
    • 2023-03-17
    • 2016-12-27
    • 2021-03-23
    相关资源
    最近更新 更多