【问题标题】:Difference between $() and () in BashBash 中 $() 和 () 的区别
【发布时间】:2023-03-29 02:18:01
【问题描述】:

当我键入ls -l $(echo file) 时,括号中的输出(只是简单的回显)被获取并传递给外部ls -l 命令。相当于简单的ls -l file

当我输入ls -l (echo file) 时出现错误,因为不能将() 嵌套在外部命令中。

有人可以帮我理解$()() 之间的区别吗?

【问题讨论】:

  • 一个是语法错误;另一个不是。他们几乎没有任何共同点。
  • 您希望ls -l (echo file) 做什么?

标签: linux bash unix subshell


【解决方案1】:

$(cmd)cmd 的结果替换为字符串,而(cmd; cmd) 在子进程中运行命令列表。

如果要将一个或多个命令的输出放入变量中,请使用 $( cmd ) 形式。

但是,如果您想运行多个命令并将它们视为一个单元 使用 () 形式。

当您想在后台运行一组命令时,后者很有用:

(git pull; make clean; make all) &

【讨论】:

  • 对不起,但我还是不明白... variable=$(ls; ps) echo $variable 和eveyrting 是正确的,但是 variable=(ls; ps) 给出语法错误 (ls; ps) 执行两个命令 variable=(ls ps); echo $variable 字面意思是“ls”
【解决方案2】:

它们是不同的,但它们之间存在助记符关系。

(...) 是一个启动新子shell 的命令,在该子shell 中运行shell 命令。

$(...) 是一个启动新子shell 的表达式,其扩展是它运行的命令产生的标准输出。

这类似于bash 中的另一个命令/表达式对:((...)) 是一个算术语句,而$((...)) 是一个算术表达式。

【讨论】:

    【解决方案3】:

    这些是不同的东西。

    $() 计算表达式(执行命令),例如 ``(反引号)

    > (echo ls)
    ls
    
    > $(echo ls)
    file1  file2
    
    > `echo ls`
    file1  file2
    
    > echo $(echo ls)
    ls
    

    【讨论】:

    • 不应该是echo $(echo ls)
    【解决方案4】:

    () 也用于在 bash 中创建数组。见man bash:

    使用 name=(value1 ... valuen) 形式的复合赋值对数组进行赋值,其中每个值的形式为 [subscript]=string。

    $ arr=(a b c 'd f' e)
    $ declare -p arr 
    declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d f" [4]="e")
    

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2012-01-07
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多