假设我有一个命令cmd
,它以参数形式创建一个新的文件名:
例如,
cmd -w /root/myfile
如何改变此表达式以便使用直接使用文件输出而不是写入文件的自定义命令。
我不想写入文件然后在其上触发命令,而是将输出cmd
直接放在新的自定义命令中。
例如,不需要创建文件然后运行
cat myfile | gpg -e > myfile.gpg
我正在寻找直接加密输出的表达式。
解决方案可能是使用类似
(cmd -w /dev/device) & (dd if=/dev/device | gpg -e > myfile.gpg)
Fifo 并不总是有效。
答案1
Bash 允许使用构造/dev/fd/
自由度 使用文件描述符来引用文件自由度;标准输入是/dev/fd/0
,标准输出是/dev/fd/1
,等等,当然也可以打开其他文件描述符。
这意味着如果你有一个命令命令名称它不能输出到标准输出,但接受-o
文件名选项,你可以让它写入标准输出
cmdname -o /dev/fd/1
答案2
gpg
可以接受来自流或文件的输入和输出。如果可以在没有 -w 标志的情况下使用第一个命令,并且避免必须创建文件,只要您的命令输出到 stdout,您就可以使用:
cmd | gpg -e -o /path/to/myfile.gpg
它会直接将您的加密信息写入文件,而无需创建中间文件。
答案3
编写一个以文件名作为位置参数的 bash 函数$1
。这样,您的 3 条命令就会浓缩为 1 条。
encrypt(){
cmd -w "$1"
cat "$1" | gpg -e > "$1".gpg
}
将其放入 .bashrc 中,运行source ~/.bashrc
,然后使用
encrypt myfile