3 ms·
You had: $ strace bash -c 'echo hi' | grep 'exec' execve("/usr/bin/bash", ["bash", "-c", "echo hi"], 0x7fffe264aad0 /\* 24 vars */) = 0 Something seem
by rascul 5y ago
You had:
$ strace bash -c 'echo hi' | grep 'exec'
execve("/usr/bin/bash", ["bash", "-c", "echo hi"], 0x7fffe264aad0 /\* 24 vars */) = 0
Something seems off. strace(1) prints the trace to stderr not stdout, so you should need |& not | to catch it with grep. At least, that's how it works here.
Also, cat does not appear to be inlined for me:
rascul@smarts:~> strace bash -c 'cat /etc/os-release' |& grep 'exec'
execve("/usr/bin/bash", ["bash", "-c", "cat /etc/os-release"], 0x7ffe7b5334e0 /* 88 vars */) = 0
execve("/usr/bin/cat", ["cat", "/etc/os-release"], 0x562c447076f0 /* 88 vars */) = 0*
- junon 5y agoYeah good catch, I forgot it since I didn't copy 1:1 the command line into vim when I formatted it for HN. I use fish + powerline so the command line doesn't copy correctly. In fish, it's `&|`, which would look weird anyway. I just forgot to add the `&` after the `|`. The output was copied 1:1 though. The inlining is an implementation detail and I've seen it happen differently across different platforms.
- rascul 5y ago> The inlining is an implementation detail and I've seen it happen differently across different platforms. Do you have more information on this? I would be interested to read more about it. As far as I was aware (and my knowledge is certainly not exhaustive), the only thing kinda related is as noted in the bash man page: > The command substitution $(cat file) can be replaced by the equivalent but faster $(< file).
- junon 5y agoI don't, sorry. I just know it's something some implementations opt-in to (especially drop-in replacements to bash). It's behavior I've observed quite a bit and have leveraged it in some cases to improve the performance of some critical bash scripts over the years. I'd also be interested in some prose about it.