在一个命令中创建临时文件并将输出重定向到它

时间:2016-11-04 02:56:11

标签: bash shell unix

我设计了一个自定义脚本来grep .bash_history备份文件的连续列表。在我的脚本中,我正在使用mktemp创建一个临时文件,并将其保存到变量temp。接下来,我使用cat命令将输出重定向到该文件。

是否有办法创建临时文件(使用mktemp),将输出重定向到它,然后将其存储在一个命令中的变量中,同时保留换行符?

下面的代码片段工作正常,但我觉得有一种更简洁和规范的方法可以在一行中实现这一点 - 可能使用process substitution或类似的东西。

# Concatenate all .bash_history files into a temporary file `temp`.
temp="$(mktemp)"
cat "$HOME/.bash_history."* > $temp
trap 'rm -f $temp' 0

# Set `HISTFILE` shell variable to the `temp` file.
HISTFILE="$temp"

keyword="$1"

# Search for `keyword` using the `history` command
if [[ "$keyword" ]]; then
    # Enable history
    set -o history

    history | grep "$keyword"

    # Disable history
    set +o history
else
    echo -e "usage: search <keyword>"
    exit 0
fi

3 个答案:

答案 0 :(得分:2)

如果您对使tempfile以前没有非空值的条件赋值的副作用感到满意,可以通过${var:=value}扩展直接进行:

cat "$HOME/.bash_history" >"${tempfile:=$(mktemp)}"

答案 1 :(得分:0)

我想有不止一种方法可以做到这一点。我发现以下是为我工作的:

cat myfile.txt > $(echo "$(mktemp)")

另外,不要忘记tee

cat myfile.txt | tee "$(mktemp)" > /dev/null

答案 2 :(得分:0)

cat myfile.txt | f=`mktemp` && cat > "${f}"