在内存中创建临时文件并将其用作命令的输入文件

时间:2016-08-30 14:32:35

标签: bash

有一个命令pdflatex,我想在我的bash脚本中使用它。它将输入一个文件名作为输入,它将在哪个内容上工作。

现在我的算法如下:

@Html.ActionLink("Display", "Display", "ControllerName", new { id = item.Id }, null )

// Or if you want a button that acts as a link, and not just a plain link

<input type="button" class="btn" value="Display" onclick="location.href='@Url.Action("Display", "ControllerName", new { id = item.Id })'" />

现在这可以按预期工作了。但我想我可以通过减少磁盘I / O(因为&gt;重定向写入文件)来加快速度。我希望我可以编写类似for stuff in list of stuff; do echo "${stuff}" > /tmp/tmpStuff pdflatex /tmp/tmpStuff done 的内容,但pdflatex使用文件而不是stdin作为输入。有没有办法将echo "$stuff" | pdflatex /tmp/tmpStuff保留在内存中并将其作为一种文件传递给pdflatex?

TLDR:如果我能够创建一个可以命名并且在内存中的临时文件,我会很高兴。

3 个答案:

答案 0 :(得分:4)

您可以使用流程替换:

<(list)

来自Bash参考手册:

  

this one

     

支持命名管道的系统支持进程替换   (FIFO)或命名打开文件的/ dev / fd方法。它采取的形式   的

>(list)
     

>(list)
     

运行进程列表时,其输入或输出连接到FIFO或/ dev / fd中的某个文件。作为扩展的结果,此文件的名称作为参数传递给当前命令。如果   使用<(list)表单,写入文件将为列表提供输入。如果使用pdflatex <<< "$stuff" 表单,则应读取作为参数传递的文件以获取列表的输出。请注意,&lt;之间不会出现空格。或者&gt;和左括号,否则构造将被解释为重定向。

我也想知道here-string是否会成功:

{{1}}

答案 1 :(得分:1)

许多shell和Linux作为一个整体接受:

echo "${stuff}"  | pdflatex /dev/stdin

答案 2 :(得分:0)

保证

没有所提供的解决方案可以在任何命令上使用

请考虑以下myCommand

#!/bin/bash
# myCommand
test -f "$1" || { echo "error: Please provide a file"; exit 1; }
echo "The file content is:"$(cat $1)

尝试现有解决方案:

./myCommand <(echo "abcdef")
# error: Please provide a file

echo "abcdef" | ./myCommand /dev/stdin
# error: Please provide a file

在我的Ubuntu中,我使用以下方法:

ramtmp="$(mktemp -p /dev/shm/)"
echo "abcdef" > $ramtmp
./myCommand $ramtmp
# The file content is:abcdef

因此,在您的情况下是:

ramtmp="$(mktemp -p /dev/shm/)"
for stuff in list of stuff; do
  echo "${stuff}" > $ramtmp
  pdflatex $ramtmp
done 

如果pdflatex执行是非阻塞的,请在循环内添加第一行。

请注意,我不确定当前有多少发行版支持它。参见Wikipedia article

基于2.6内核及更高版本的Linux发行版提供/dev/shm作为RAM磁盘形式的共享内存,更具体地说,是作为世界可写目录 存储在内存中的>(系统的每个用户都可以在其中创建文件的目录)。默认情况下, RedHat 基于Debian的发行版都包含。在内核配置文件中,对此类RAM磁盘的支持完全是可选的。[5]