Juho-Pekka Kuitunen wrote: > Reproduce example; > $ echo "testdir/testfile" | xargs -I '{}' echo '{}', dir: $(echo dirname > '{}') = $(dirname '{}')
Thank you for the report and the very nice test case. It made debugging this problem so very much simpler. > Expected output; > testdir/testfile, dir: dirname testdir/testfile = testdir > > Actual output; > testdir/testfile, dir: dirname testdir/testfile = . Ah... But you have missed a critical point! :-) The $(...) is expanded by the current shell and not by the xargs. Use echo to see what you are asking. $ echo xargs -I '{}' echo '{}', dir: $(echo dirname '{}') = $(dirname '{}') xargs -I {} echo {}, dir: dirname {} = . > This behavior seems to be limited to the xargs -I replace-str usage > pattern, any other way I can think of running dirname works fine. The problem is the $(...) which is running the dirname during the earlier shell command line parsing pass and passing the result off to the xargs command. > Basename has similarly wonky behavior, it prints the full string > instead of doing any stripping. Also using $(...)? :-) > Not sure if there's a bug involved (or if it's on the findutils or > coreutils side). Could also just be something silly I'm overlooking. > I've tested this with findutils 4.4.2 and coreutils 8.5 & 8.13 with > identical results. So... Not a bug. Agreed? (I am having a good chuckle. I hope you will too.) We will close the bug then. Bob