En este xkcd comic: ¿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
?
En este xkcd comic: ¿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
?
$ cat > hello.c
#include <stdio.h>
main(void) {
printf("Hello, world.\n");
}
^D
$ gcc hello.c
$ ./a.out
Hello, world.
+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
sed sería un editor diario interesante: P –
... porque los programadores reales lo hacen bien la primera vez. – marijne
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?
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
¡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
Cuando no se especifica ningún nombre de archivo, cat lee de stdin, como la mayoría de los otros programas de UNIX. –
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)
+1 por dar realmente principal su lista de argumentos adecuada y valor de retorno. Eso es dedicación. – chaos
: 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 –
Si vamos a ser realmente técnicos al respecto, ¿no debería ser char ** argv o char * argv []? – MatrixFrog
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
.
@Alex Creo que también fue más clasico. Uso agradable de la pipa –
Y tiene versi incorporado en el control a través de .bash_history! – dbr
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 " –
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
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.
No lo es (a juzgar por su listado). Es 0xFEEDFACE (suponiendo que la máquina es little-endian). –
¡Correcto! En mi máquina PowerPC (big endian) este es el resultado 0000000: cara de alimentación 0000 0012 0000 0000 0000 0002 ................ –
Lo traté como un endian medio ... consiguiendo viejo aparentemente :( –
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).
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.
Creo que el punto de esta pregunta involucra la utilidad 'cat', por lo que esta respuesta no califica: D – YudhiWidyatama
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"
espera, no tienes ningún problema con el uso de una aguja imantada entonces? –
Alas de mariposa son una perra para limpiar desde un teclado. Déjame decirte. –
Además, estas respuestas son brutales. El esfuerzo realizado para explicar una broma de la manera más geek posible. +1 –