我怎么能管的命令,以防万一它返回true的输出?
function open
{
TEMPFILE=$(mktemp -u)
if ! gpg2 --quiet --decrypt --batch --passphrase "$2" "$1" 2> $TEMPFILE; then
error $"Password errata od errore di lettura dal file\n\nDettagli:\n$(grep -v '^$' $TEMPFILE)"
rm -f $TEMPFILE
return 1
fi
rm -f $TEMPFILE
}
if ! open "$@" "$PASSWORD"; then
exit 1
fi | <SOMECOMMAND>
通过这种方式,它只是管和不检查是否打开返回true或false,这样不会永远执行“退出1”。
我怎样才能解决这个问题,而无需使用文件(出于安全原因)。
之前,我提出一个解决方案,让我解释任何这是比你想象更困难。 基本问题是定时:在open ...
,因为它运行函数产生输出; 它产生后它已经完成运行 (和它已经产生其输出后因此)一个退出状态。 既然你想要做不同的事情取决于退出状态输出,必须存储输出某处暂时直到函数结束,您可以决定如何处理输出做。
一个管道本身不会为这个工作,因为管道不存储数据(除了一点点缓冲空间) - 他们从一个程序传送数据“活”到另一个,而且在这种情况下,第二程序无法启动直到第一个完成后。 通常情况下,这个(存储数据的文件是什么),一个临时文件将是完美的,但你不希望,出于安全考虑。 这几乎树叶把数据某处RAM(虽然,要么是不完全安全的...)。
@Karoly霍瓦特的回答提出了存储在bash变量输出(存储在RAM),但没有工作,因为bash中不与变量值空字节处理。 所以,我建议您在何处使用数据的“安全”的编码变异,并把在一个bash变量。 我用UUENCODE格式,但你也可以使用的base64,十六进制转储,等等。
if result=$(open "$@" "$PASSWORD" | uuencode -; exit ${PIPESTATUS[0]}); then
echo "$result" | uudecode -p | SOMECOMMAND
fi
需要注意的是PIPESTATUS是bashism,所以你应该开始与脚本#!/bin/bash
。 此外,如果输出太长,你可能多少数据的bash希望存储/扩展的/ etc碰上限制; 如果这原来是一个问题,事情变得更加复杂。
顺便说一句,如果你担心安全,不要使用gpg2的--passphrase
选项-传递密码在命令行上暴露出它例如谁运行谁ps
在正确的时间,这是一个非常糟糕的主意。 gpg2有许多选项提供的口令,所以请使用一个更好的。
使用命名管道和存储返回值
mkfifo piper;
open "$@" "$PASSWORD"; retval=$? > piper &
if [ x"$retval" != x0 ]
then
rm piper
exit 1
fi
<SOMECOMMAND> < piper
rm piper
下面的代码应该有条件管的结果,如果文件成功打开:
result=open "$@" "$PASSWORD"
if [ $? -gt 0 ]; then
exit 1
fi
echo "$result" | <SOMECOMMAND>