【问题标题】:is "&&" exactly equivalent to "and" in fish shell?“&&”是否完全等同于鱼壳中的“and”?
【发布时间】:2021-10-26 12:34:36
【问题描述】:

fish shell&&and 中似乎表现相同。它们完全一样吗?是否存在它们行为不同的极端情况?

【问题讨论】:

标签: shell scripting fish


【解决方案1】:

虽然它们用于同一件事,但它们有着根本的不同:​​

sh && 是一个二元运算符,它接受两个命令,运行第一个命令,只有成功时才运行第二个命令。如果失败则退出状态为第一个命令,否则退出状态为第二个命令。

fish and 是一个一元运算符,它接受单个命令,如果 $status 为 0 则运行它。如果运行,退出状态由命令选择性地修改。

在这里你可以看到arity的区别:

$ fish -c 'and echo true'
true

$ sh -c '&& echo true'
sh: 1: Syntax error: "&&" unexpected

在这里您可以看到and 如何对不在它之前的命令进行操作:

$ fish -c 'false; set x 1; and echo true'
(no output)

$ sh -c 'false; x=1 && echo true'
true

【讨论】:

    【解决方案2】:

    and/&&or/||not/! 是一样的,除了运算符优先级和是否可以换行。

    想象一下:

    echo 1 || echo 2; and echo 3
    

    || 首先绑定,所以echo 1 || echo 2 被认为是一回事。它打印“1”,成功所以它跳过打印“2”,然后因为||整体成功打印“3”。

    虽然

    echo 1; or echo 2 && echo 3
    

    将只打印“1”。 echo 1 成功,所以其余的都被忽略了。

    还有“;”对于; and; or 可以换行,而&&|| 不能换行(不转义上一行的结尾):

    # valid
    echo 1
    and echo 2
    
    # invalid
    echo 1
    && echo 2
    
    # valid - note the `\` is the last thing on the line
    echo 1 \
    && echo 2
    

    除了那些东西(和任何错误)之外,这些都是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多