我的意思是这样的:
echo 'main = print 1' | ghc > executable
GHC回复:ghc: no input files
我错过了什么吗?这有可能吗?
答案 0 :(得分:6)
据我所知,答案是否定的。我的尝试:
$ echo 'main = print 1' | ghc
ghc: no input files
$ echo 'main = print 1' | ghc -
ghc: unrecognised flag: -
$ echo 'main = print 1' | ghc /dev/stdin
target ‘/dev/stdin’ is not a module name or a source file
$ ln -s /dev/stdin stdin.hs; echo 'main = print 1' | ghc stdin.hs
stdin.hs: hFileSize: inappropriate type (not a regular file)
问题:ghc使用.hs
,.lhs
或.o
等后缀来决定如何处理文件(这就是#3失败的原因)。即使你讨厌它(#4),ghc真的希望stat()
文件得到它的大小,这在管道上失败。
答案 1 :(得分:4)
尽管普通process substitution无法做到这一点,但zsh提供的special kind of process substitution-like behavior允许"文件"比传统的进程替换更像是一个真正的文件(通过创建一个实际的临时文件):
% ghc -o Main -x hs =( echo 'main = print 1' )
[1 of 1] Compiling Main ( /tmp/zshjlS99o, /tmp/zshjlS99o.o )
Linking Main ...
% ./Main
1
%
-x hs
选项告诉ghc
表示文件名已在.hs
中结束。
总的来说,这实际上是手动创建和删除临时文件的捷径。
我不确定是否有其他炮弹支持此类事情。至少,我不认为bash会这么做。
答案 2 :(得分:2)
通常ghc用作编译器,您可以在文件上运行(ghc可以在其上查找和推断结尾类型等)并将输出文件指定为标志。
但是,您当然可以使用
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename