当我输入ls -l $(echo file)
时,括号中的输出(仅为简单的echo)将被传递给外部的ls -l
命令。它相当于简单的ls -l file
。
当我输入ls -l (echo file)
时,会出现错误,因为不能在外部命令中嵌套使用()
。
有人可以帮助我理解$()
和()
之间的区别吗?
$(cmd)
将 cmd
命令的结果以字符串形式替换,而 (cmd; cmd)
则在子进程中运行一系列命令。
如果您想将一个或多个命令的输出放入变量中,请使用 $(cmd) 格式。
然而,如果您想运行多个命令并将它们视为单个单位,则使用 () 格式。
当您想要在后台运行一组命令时,后者很有用:
(git pull; make clean; make all) &
variable=$(ls; ps)
</br>
echo $variable
一切都正确,但是 </br>
variable=(ls; ps)
会出现语法错误 </br>
(ls; ps)
执行两个命令 </br>
variable=(ls ps); echo $variable
只会输出字面上的 "ls" - run4gnu(...)
是一个命令,它启动一个新的子Shell,在其中运行Shell命令。
$(...)
是一个表达式,它启动一个新的子Shell,其扩展是所运行命令产生的标准输出。bash
中的另一组命令/表达式对: ((...))
是一个算术语句,而 $((...))
是一个算术表达式。$()
评估表达式(执行命令)就像``(反引号)一样。> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
echo $(echo ls)
,对吗? - Barmar()
在 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")
ls -l (echo file)
做什么? - John1024