【Shell】bash的<<, <<<, < <()用法

这几个都是在bash脚本中经常用到的:
第一种:

cmd <<EOF
..
EOF

含义是here-document,表示传给给cmd的stdin的内容从这里开始是一个文档,内容碰到EOF为截止

$ cat <<EOF
This is a document
EOF

把EOF之间的内容,作为一个文档传递给cmd作为其stdin的内容。

第二种:

cmd <<< "string"

含义是here-string,表示传给给cmd的stdin的内容从这里开始是一个字符串。

$ cat <<<"aaa"

把字符串"aaa"传递给cmd作为其stdin的内容

第三种:

cmd1 < <(cmd2)

标准名称叫:Process substitution
这个语法看起来很怪异,其实他就是两个语法。

<(cmd2): 把cmd2的输出写入一个临时文件
cmd1 < : 这是一个标准的stdin重定向。

把两个合起来,就是把cmd2的输出(stdout)传递给cmd1作为输入(stdin);中间通过临时文件做传递。
举一个例子:

$ cat < <(echo "12345")
12345

分开看:

$ echo <(echo "12345")
/dev/fd/63

可见<(echo "12345")的输出就是文件/dev/fd/63,文件内容是字符串“12345“;/dev/fd/63是一个匿名pipe文件(为什么是63,估计是当时分的吧?我猜的);其实我们可以假设整个命令是这样的:

$ cat < /dev/fd/63

整个命令串的含义就是把字符串"12345"写到临时文件/dev/fd/63,然后让cat从临时文件/dev/fd/63读取内容。

应用场景:
检查密钥对是否有效
How to check if an RSA public / private key pair match
I have two files, id_rsa and id_rsa.pub. What command can be used to validate if they are a valid pair?

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )

参考文章How to check if an RSA public / private key pair match

posted @ 2022-03-07 22:43  爱啦啦  阅读(1147)  评论(0编辑  收藏  举报