Search code examples
linuxshellcommand-linecatls

Some strange output on my command in linux shell


I've written the following in the command:

$ cat /bin/ls > blah
$ cat blah blah blah > bbb
$ chmod u+x bbb
$ ./bbb

And it printed all the file names in the current working directory.

My question is why? and why not 3 times?


Solution

  • Because the Linux executable file format (ELF) is not a script that you can copy-paste three times in a row to get the same result. To be more precise, the header contains a single entry point (think of it as the address of where int main() has been stored), which is where the instructions are read from. Once you reach the final return 0; or whatever, the program stops, even if there is more (nicely structured) binary garbage following in the binary file.

    TL;DR: Don't forget - /bin/ls is a compiled binary and not a shell script.