我以为我对 bash 文件重定向有很好的处理能力,并且通常我会尽量避免“无用使用 cat ”,但是我在脚本中遇到了一些意外行为,我想了解为什么会发生这种情况。
在 bash 脚本中,我执行:
somecommand < file1 > file2
Run Code Online (Sandbox Code Playgroud)
我的期望是 file1 是安全的并且以只读方式打开。在实践中,我发现 file1 可以被覆盖。如何/为什么会发生这种情况,有没有办法在不诉诸于的情况下防止它cat?
如果它像我想象的那样工作(该过程最终会得到一个直接的 rw 文件描述符?),那么以这种方式重定向文件似乎应该被认为是危险的,但我之前从未见过这种行为。
从我的案例中添加一些细节:有问题的命令是sops,它在后台做一些 GPG 的东西。提示符GPG密码有时†被写入到用于输入文件,覆盖它。我使用的完整命令是:
sops --input-type json --output-type json -d /dev/stdin < ./secrets/file.json > ./secrets/file-decrypted.json
Run Code Online (Sandbox Code Playgroud)
从那以后我切换到了cat file1 | sops.. > file2,一切都按预期工作。我会说这是“对猫的无用使用” - 但它似乎不再那么无用了!
有没有一种简单的方法来检查哪个程序写入了哪个文件?例如,我想检查哪个程序向 /var/log/messages 写入了错误。