2009-05-28 7 views
23

En este xkcd comic: Real Programmers¿Cómo programo el uso de cat?

Mencionan que los programadores de verdad el uso cat. Bueno, me preguntaba a mí mismo: ¿cómo podría programar usando el comando cat?

+30

espera, no tienes ningún problema con el uso de una aguja imantada entonces? –

+6

Alas de mariposa son una perra para limpiar desde un teclado. Déjame decirte. –

+0

Además, estas respuestas son brutales. El esfuerzo realizado para explicar una broma de la manera más geek posible. +1 –

Respuesta

56
$ cat > hello.c 
#include <stdio.h> 

main(void) { 
    printf("Hello, world.\n"); 
} 
^D 
$ gcc hello.c 
$ ./a.out 
Hello, world. 
+0

+1 jejeje. ¡¡Así es como!!. Sin sofisticados comandos de edición. (como en ed) Por cierto, nunca he logrado usar ed. Siempre quise hacerlo, porque a vi le tomó mucho tiempo comenzar desde una terminal remota (emacs estaba fuera de cuestión). – OscarRyz

+0

sed sería un editor diario interesante: P –

+31

... porque los programadores reales lo hacen bien la primera vez. – marijne

4

Creo que es posible que se haya perdido la broma. El punto es que cat no es un editor; es simplemente una manera de introducir el texto en el archivo de una sola vez, sin editarlo ni corregirlo. Lo escribes una vez, y eso es todo.

Si te estás metiendo en otra cosa, ¿puedes estar más claro?

+1

Vicky: Creo que la pregunta es legítima. Puede que no esté claro cómo ingresar texto usando cat (no estaba claro para mí definitivamente). Creo que el suyo sería un muy buen comentario, pero no tan buena respuesta. – OscarRyz

+0

¡Exactamente lo que dijo Oscar! No sabía cómo usar el gato de esa manera. Lo he utilizado para generar el contenido de un archivo, pero nunca me ocurrió que pudieras hacer lo que el usuario: explicó el caos. – Sparragus

+2

Cuando no se especifica ningún nombre de archivo, cat lee de stdin, como la mayoría de los otros programas de UNIX. –

4

La broma es que no se edita, sólo tiene que utilizar cat y tal vez (si se va a ser obtuso) ... echo. Por ejemplo:

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

entonces

cat helloworld.c 

repetición.

(también, debo ser aburrido para ir y tipo que fuera)

+4

+1 por dar realmente principal su lista de argumentos adecuada y valor de retorno. Eso es dedicación. – chaos

+0

: P, bueno, me iba a la molestia de escapar de las comillas (e incluso de la nueva línea) en las citas ... ¿por qué no hehe –

+1

Si vamos a ser realmente técnicos al respecto, ¿no debería ser char ** argv o char * argv []? – MatrixFrog

37

No, echo es claramente mejor:

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

Incluso si desea utilizar cat (felinos son, después de todo maravilloso), ¿por qué molestarse en poner la fuente en el disco? Simplemente redirija la salida cat al compilador, como en el caso echo.

+1

@Alex Creo que también fue más clasico. Uso agradable de la pipa –

+41

Y tiene versi incorporado en el control a través de .bash_history! – dbr

+3

Lástima que bash no puede ejecutar un ejecutable proveniente de una tubería; de lo contrario, podría hacerlo sin guardar la salida del compilador con algo como "echo ... | gcc -xc - -o - | execute-stdin-command " –

4

Hay a book available sobre el tema.

+0

... y dicen que a la economía no le está yendo bien ... –

2

Veamos hasta dónde podemos tomar esto.

la salida a todo esto será:

 
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 
6

gcc?programadores reales utilizan cat y 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. 

por cierto, no sabía que era 0xFEEDFACE el número mágico en los binarios Mach-O ... cool.

+1

No lo es (a juzgar por su listado). Es 0xFEEDFACE (suponiendo que la máquina es little-endian). –

+0

¡Correcto! En mi máquina PowerPC (big endian) este es el resultado 0000000: cara de alimentación 0000 0012 0000 0000 0000 0002 ................ –

+1

Lo traté como un endian medio ... consiguiendo viejo aparentemente :( –

0

Vea el artículo de Wikipedia sobre programadores reales. Puede encontrar tutoriales en la web. Lo mejor es saber ensamblar primero (lo sé muy bien).

"Los programadores reales no usan IDEs, escriben programas usando cat> a.out" (es decir, escriben archivos binarios legibles por máquina de principio a fin sin cometer ningún error).

1

He robado la respuesta aceptada y más votada y la he combinado con la respuesta de eco, pero he agregado la ejecución condicional automática si la compilación fue exitosa.

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

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

Creo que el punto de esta pregunta involucra la utilidad 'cat', por lo que esta respuesta no califica: D – YudhiWidyatama

0

check this posterior

El puesto es un poco fuera de fecha, ya que hace que ciertas suposiciones acerca de la ubicación de la página vsyscall. Pero si tenía una copia de Linux en ejecución el kernel 5.2.53, debería ser capaz de ejecutar algo como:

/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" 
Cuestiones relacionadas