为什么在向它发送标准输出后我有一个空文件

Why do i have an empty file after sending stdout to it

我正在使用 bash 执行以下命令来过滤证书中的信息

openssl s_client -connect google.com:443 < /dev/null > cert.pem 
openssl x509 -in cert.pem -noout -subject > commonName
tr "," "\n" < commonName | sed -nr '/CN/p' | tr -d ' /t' > commonName

最后一条命令使文件 "commonName" 为空,我想知道这是为什么。 如果我改为附​​加文件“>>”,则会显示所需的过滤输出,但会保留未过滤的内容。

将文件留空

tr "," "\n" < commonName | sed -nr '/CN/p' | tr -d ' /t' > commonName

有效,但有不需要的内容

tr "," "\n" < commonName | sed -nr '/CN/p' | tr -d ' /t' >> commonName

编辑, 可能会添加发送到具有新名称的文件按预期工作。例如,将 "commonName" 更改为 "test"。

提前致谢! /R

您不能使用其他命令编辑文件并仅在一个管道中使用 sed(您这样做的方式)。您需要一个临时文件:

openssl s_client -connect google.com:443 < /dev/null > cert.pem 
openssl x509 -in cert.pem -noout -subject > commonName
tr "," "\n" < commonName | sed -nr '/CN/p' | tr -d ' /t' > /tmp/temp
mv /tmp/temp commonName

以及实现整个脚本的更好方法,无需临时文件:

openssl s_client -connect google.com:443 < /dev/null > cert.pem 
openssl x509 -in cert.pem -noout -subject |
    tr "," "\n" |
    grep -o 'CN .*' > commonName