答案 0 :(得分:56)
$ cat > hello.c
#include <stdio.h>
main(void) {
printf("Hello, world.\n");
}
^D
$ gcc hello.c
$ ./a.out
Hello, world.
答案 1 :(得分:37)
不,echo
显然更好:
echo 'main(){puts("Hello world\n");}' | gcc -xc -
即使您想使用cat
(猫科动物毕竟是精彩的),为什么还要把源放到磁盘上呢?只需将cat
的输出重定向到编译器,就像echo
情况一样。
答案 2 :(得分:6)
gcc
?真正的程序员使用cat
和 xxd
:
$ cat | xxd -r > a.out
0000000: cefa edfe 0700 0000 0300 0000 0200 0000 ................
0000010: 0b00 0000 a803 0000 8500 0000 0100 0000 ................
0000020: 3800 0000 5f5f 5041 4745 5a45 524f 0000 8...__PAGEZERO..
0000030: 0000 0000 0000 0000 0010 0000 0000 0000 ................
<lot of other stuff>
0003090: 0a00 0000 0b00 0000 2000 6479 6c64 5f73 ........ .dyld_s
00030a0: 7475 625f 6269 6e64 696e 675f 6865 6c70 tub_binding_help
00030b0: 6572 005f 5f64 796c 645f 6675 6e63 5f6c er.__dyld_func_l
00030c0: 6f6f 6b75 7000 6479 6c64 5f5f 6d61 6368 ookup.dyld__mach
00030d0: 5f68 6561 6465 7200 5f4e 5841 7267 6300 _header._NXArgc.
00030e0: 5f4e 5841 7267 7600 5f5f 5f70 726f 676e _NXArgv.___progn
00030f0: 616d 6500 5f5f 6d68 5f65 7865 6375 7465 ame.__mh_execute
0003100: 5f68 6561 6465 7200 5f65 6e76 6972 6f6e _header._environ
0003110: 005f 6d61 696e 0073 7461 7274 005f 6578 ._main.start._ex
0003120: 6974 005f 7075 7473 0000 0000 it._puts....
^D
$ chmod 755 ./a.out
$ ./a.out
Hello, world.
顺便说一句,我不知道0xFEEDFACE
是Mach-O二进制文件中的神奇数字......很酷。
答案 3 :(得分:6)
答案 4 :(得分:4)
我想你可能错过了这个笑话。关键是cat
不是编辑;它只是一种将文本一次性写入文件的方式,无需编辑或更正。你写了一次,就是这样。
如果你正在寻找别的东西,你会更清楚吗?
答案 5 :(得分:4)
这个笑话是你不编辑,你只是使用cat
,也许(如果你将是钝的)...... echo
。例如:
echo "#stdio.h\n int main(int argc, char **argv){\nprintf(\"hello World\\n\");\nreturn(0);\n}" > helloworld.c
然后
cat helloworld.c
重复。
(另外,我也很无聊去打字)
答案 6 :(得分:4)
关于这个主题有a book available。
答案 7 :(得分:2)
让我们看看我们能走多远。
所有这些的输出将是:
Hello World
$ perl -E"$(cat)"
say 'Hello World'
^D
$ test=$(cat); perl -E"$test"
say 'Hello World'
^D
$ cat | perl -M5.010
say 'Hello World'
^D
$ cat > test; test=$(cat test); perl -E"$test"
say 'Hello World'
^D
$ cat > test; test=$(cat test)$(cat); perl -E"$test"
say
^D
'Hello World'
^D
$ cat > test; test=$(cat test); perl -E"$test$(cat)"
say
^D
'Hello World'
^D
$ cat > test; test=$(cat test); perl -E"$(cat)$test"
'Hello World'
^D
答案 8 :(得分:1)
我已经窃取了已接受和最多投票的答案并将其与回音答案相结合,但如果编译成功,我已添加了自动条件执行。
$ cat | gcc -xc - && ./a.out
#include <stdio.h>
main(void) {
printf("Hello, world.\n");
}
^D
Hello, world.
答案 9 :(得分:0)
请参阅Wikipedia关于Real Programmers的文章。您可以在网上找到教程。最好先了解装配(非常了解)。
“真正的程序员不使用IDE,他们使用cat&gt; a.out编写程序”(也就是说,他们从头到尾编写机器可读的二进制文件而不会出错)。
答案 10 :(得分:0)
该帖子有点过时,因为它对vsyscall页面的位置做出了一些假设。但是如果你有运行2.5.53内核的linux副本,你应该可以运行类似的东西:
/bin/echo -ne '\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00\x01\x00\x00\x00\x74\x80\x04\x08\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x20\x00\x02\x00\x28\x00\x00\x00\x00\x00\x01\x00\x00\x00\x74\x00\x00\x00\x74\x80\x04\x08\x74\x80\x04\x08\x19\x00\x00\x00\x19\x00\x00\x00\x05\x00\x00\x00\x00\x10\x00\x00\x01\x00\x00\x00\x8d\x00\x00\x00\x8d\x90\x04\x08\x8d\x90\x04\x08\x05\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x00\x10\x00\x00\xb0\x04\xb3\x01\xb9\x8d\x90\x04\x08\xb2\x05\xe8\x90\x63\xfb\xf7\xb0\x01\xb3\x00\xe8\x87\x63\xfb\xf7\x54\x65\x73\x74\x0a' > foo.bin
chmod +x foo.bin
./foo.bin
# would print "Test"