如何使用 cat 进行编程?

发布于 2024-07-22 11:04:05 字数 162 浏览 5 评论 0原文

在此xkcd 漫画中:

他们提到真正的程序员使用 cat。 好吧,我问自己:如何使用 cat 命令进行编程?

In this xkcd comic:
Real Programmers

they mention that real programmers use cat. Well, I was asking myself: how could you program using the cat command?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

长亭外,古道边 2024-07-29 11:04:05
$ cat > hello.c
#include <stdio.h>

main(void) {
    printf("Hello, world.\n");
}
^D
$ gcc hello.c
$ ./a.out
Hello, world.
$ cat > hello.c
#include <stdio.h>

main(void) {
    printf("Hello, world.\n");
}
^D
$ gcc hello.c
$ ./a.out
Hello, world.
逆蝶 2024-07-29 11:04:05

不,echo 显然更好:

echo 'main(){puts("Hello world\n");}'  | gcc -xc -

即使您想使用 cat(猫科动物毕竟很棒),为什么还要费心将源代码放入磁盘呢? 只需将 cat 的输出重定向到编译器,就像 echo 的情况一样。

Nah, echo is clearly better:

echo 'main(){puts("Hello world\n");}'  | gcc -xc -

Even if you want to use cat (felines are after all wonderful), why bother putting the source to disk? Just redirect cat's output to the compiler, as in the echo case.

等风来 2024-07-29 11:04:05

海湾合作委员会? 真正的程序员使用 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 二进制文件...酷。

gcc? real programmers use cat and 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.

btw, I didn't know that 0xFEEDFACE was the magic number in Mach-O binaries... cool.

放我走吧 2024-07-29 11:04:05

关于这个主题有一本书

There's a book available on the subject.

平生欢 2024-07-29 11:04:05

我想你可能错过了这个笑话。 关键是 cat 不是一个编辑器;它是一个编辑器。 这只是一种将文本一次性添加到文件中的方法,无需编辑或更正。 你写一次,就这样了。

如果你想了解其他事情,你能说得更清楚吗?

I think you might have missed the joke. The point is that cat is not an editor; it's simply a way of getting the text into the file in one go, with no editing or correcting. You write it once, and that's it.

If you're getting at something else, can you be clearer?

冷默言语 2024-07-29 11:04:05

笑话是你不编辑,你只使用 cat ,也许(如果你会变得迟钝的话)...... echo。 例如:

echo "#stdio.h\n int main(int argc, char **argv){\nprintf(\"hello World\\n\");\nreturn(0);\n}" > helloworld.c

然后

cat helloworld.c

重复。

(而且,我一定很无聊才去打字)

The joke is that you don't edit, you just use cat and perhaps (if you were going to be obtuse)... echo. For example:

echo "#stdio.h\n int main(int argc, char **argv){\nprintf(\"hello World\\n\");\nreturn(0);\n}" > helloworld.c

then

cat helloworld.c

repeat.

(also, I must be bored to go and type that out)

末が日狂欢 2024-07-29 11:04:05

让我们看看我们能走多远。

所有这些的输出将是:

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

Lets see how far we can take this.

the output to all of these will be:

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
围归者 2024-07-29 11:04:05

我窃取了接受的和投票最多的答案,并将其与回显答案结合起来,但如果编译成功,我添加了自动条件执行。

$ cat | gcc -xc - && ./a.out
#include <stdio.h>

main(void) {
    printf("Hello, world.\n");
}
^D
Hello, world.

I've stolen the accepted and most voted answer and combined it with the echo answer, but I have added automatic conditional execution if compilation was success.

$ cat | gcc -xc - && ./a.out
#include <stdio.h>

main(void) {
    printf("Hello, world.\n");
}
^D
Hello, world.
节枝 2024-07-29 11:04:05

请参阅维基百科有关真正程序员的文章。 您可以在网上找到教程。 最好先了解汇编(非常了解)。

“真正的程序员不使用IDE,他们使用cat > a.out来编写程序”(也就是说,他们从头到尾编写机器可读的二进制文件,不会犯任何错误)。

See Wikipedia article on Real Programmers. You can find tutorials on the web. Best to know assembly first (know it very well).

"Real Programmers don't use IDEs, they write programs using cat > a.out" (that is, they write machine-readable binary files from beginning to end without making any mistakes).

独行侠 2024-07-29 11:04:05

查看此帖子

该帖子有点过时了,因为它对 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"

check this post

The post is a bit out of date, as it makes certain assumptions about the location of the vsyscall page. But if you had a copy of linux running the 2.5.53 kernel, you should be able to run something like:

/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"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文