有一个命令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:如果我能够创建一个可以命名并且在内存中的临时文件,我会很高兴。
答案 0 :(得分:4)
您可以使用流程替换:
<(list)
来自Bash参考手册:
支持命名管道的系统支持进程替换 (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]