我想在我的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:如果我可以创建一个可以命名并在内存中的临时文件,我会很高兴。
所提出的解决方案均不能保证适用于所有可能的命令。
考虑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,更具体地说,作为存储在内存中的全局可写目录(系统的每个用户都可以在其中创建文件的目录)。基于RedHat和Debian 的发行版默认都包含它。对这种类型 RAM 磁盘的支持在内核配置文件中完全是可选的。[5]
许多 shell 以及整个 Linux 都接受:
回声“$ {东西}”| pdflatex /dev/stdin
您可以为此使用进程替换:
pdflatex <(echo "$stuff")
Run Code Online (Sandbox Code Playgroud)
从Bash参考手册中:
在支持命名管道(FIFO)或命名打开文件的/ dev / fd方法的系统上支持进程替换。它采取的形式
Run Code Online (Sandbox Code Playgroud)<(list)要么
Run Code Online (Sandbox Code Playgroud)>(list)运行进程列表时,其输入或输出连接到FIFO或/ dev / fd中的某个文件。作为扩展结果,此文件的名称作为参数传递给当前命令。如果使用
>(list)表单,则写入文件将为列表提供输入。如果使用了<(list)表单,则应读取作为参数传递的文件以获得list的输出。请注意,<或>与左括号之间不得出现空格,否则该构造将被解释为重定向。
而且我也想知道这里是否也可以使用以下字符串:
pdflatex <<< "$stuff"
Run Code Online (Sandbox Code Playgroud)