shell 中$()与()的区别

目录

   $()与()表达式经常出现在 shell 脚本中,像我这种用 shell 用的非常多的人有时间也会被搞糊涂,我通常是采用尝试的方法$()不行就换().这样虽然
也能写出正确的程序,但是心里还是不太放心的。所以打算花时间彻底搞明白这两个的区别。
   先说一下结论: ()中执行的命令会把结果输入到标准输出中,$()中执行的命令会把结果直接在命令行所在位置替换。下面举例来证明这个结论。

实验目录

jimila@CDYJY-JINGML:test1$ ls
t.txt
jimila@CDYJY-JINGML:test1$ cat t.txt
1
2
3

(echo ls) VS $(echo ls)

#这里 echo ls 的结果 ls 会输出到标准输出
jimila@CDYJY-JINGML:test1$ (echo ls)
ls

#这里 echo ls 的结果 ls 会做为命令执行  $(echo ls) 等于直接输入 ls 执行命令
jimila@CDYJY-JINGML:test1$ $(echo ls)
t.txt

ls -l (ls) VS ls -l $(ls)

# 这里可以看出 <(ls) 把 ls 的结果输出到到管道中 并且在 bash 中被替换为了 /dev/fd/63 整个命令就变成了 ls -l /dev/fd/63
jimila@CDYJY-JINGML:test1$ ls -l  <(ls)
lr-x------ 1 jimila jimila 64 331 15:16 /dev/fd/63 -> pipe:[820426]

# 整个命令被替换成了 ls -l <t.txt
jimila@CDYJY-JINGML:test1$ ls -l  <$(ls)
总用量 4
-rw-rw-r-- 1 jimila jimila 6 331 14:36 t.txt

jimila@CDYJY-JINGML:test1$ ls -l  <t.txt 
总用量 4
-rw-rw-r-- 1 jimila jimila 6 331 14:36 t.txt
jimila@CDYJY-JINGML:test1$ 

wc -l <(ls) VS wc -l < <(ls) VS wc -l <$(ls)

# 命令被替换为了 wc -l /dev/fd/63
jimila@CDYJY-JINGML:test1$ wc -l  <(ls)
1 /dev/fd/63

# 命令被替换为了 wc -l < /dev/fd/63
jimila@CDYJY-JINGML:test1$ wc -l <  <(ls)
1

# 命令被替换为了 wc -l <t.txt
jimila@CDYJY-JINGML:test1$ wc -l  <$(ls)
3

目录