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

Sim*_*lbc 5 bash

我想在我的bash脚本中使用pdflatex命令。它以文件名作为输入,它将在其上处理内容。

现在,我有一个算法,如下所示:

for stuff in list of stuff; do
  echo "${stuff}" > /tmp/tmpStuff
  pdflatex /tmp/tmpStuff
done 
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_* An 8

所提出的解决方案均不能保证适用于所有可能的命令。

考虑myCommand以下(而不是pdflatex):

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

尝试现有的解决方案:

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

echo "abcdef" | ./myCommand /dev/stdin
# error: Please provide a file
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 中,我使用以下方法(利用/dev/shm内存文件存储):

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

所以在你的情况下它将是:

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

Run Code Online (Sandbox Code Playgroud)

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

请注意,我不确定目前有多少发行版支持它。请参阅维基百科文章

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


Gil*_*ert 7

许多 shell 以及整个 Linux 都接受:

回声“$ {东西}”| pdflatex /dev/stdin

  • http://stackoverflow.com/users/5432899/simonlbc:/dev/stdin 是为没有特定方式访问 stdin 的程序添加的...您的帖子暗示 pdflatext 是其中之一。在简单的情况下,它也比过程替换更容易。使用较长的名称有时也很有用,并且可以自我记录。仅供参考: /dev/std* 系列的另外两个也存在。 (2认同)

fed*_*qui 5

您可以为此使用进程替换:

pdflatex <(echo "$stuff")
Run Code Online (Sandbox Code Playgroud)

从Bash参考手册中:

3.5.6流程替代

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

<(list)
Run Code Online (Sandbox Code Playgroud)

要么

>(list)
Run Code Online (Sandbox Code Playgroud)

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

而且我也想知道这里是否也可以使用以下字符串:

pdflatex <<< "$stuff"
Run Code Online (Sandbox Code Playgroud)