On 3/22/21, Greg Wooledge <g...@wooledge.org> wrote: > On Mon, Mar 22, 2021 at 09:50:06AM +0000, Budi wrote: >> in a function k() in ~/.bashrc >> >> k(){ unset u;h=0; o=(${h:+ ! -path "./*.txt"}) ;u=($u "${o[@]}"); c=(. >> -regextype posix-extended "${b[@]}" -print); find "${c[@]}" >> } >> >> in output set -x: >> >> + unset u >> + h-0 > > This is clearly a falsehood. You didn't paste the actual output. > >> + o=(${h:+ ! -path "./*.txt"}) >> + u=($u "${o[@]}") > > Why have the unquoted $u here when you know the variable is unset? > >> + c=(. -regextype posix-extended "${b[@]}" -print) > > What's in the array "b"? You never showed any such array. > >> + find . -regextype posix-extended ' ! -path ./*.txt' -print >> find: paths must precede expression: ` ! -path ./*.txt' >> >> Why and how to solve ? > > I think your real question is this one -- why did the exclamation point > and the word -path and the word ./*.txt all get squashed together into > a single word, instead of being inserted as three separate words? > > If you can simplify your code down to *just* that case, and if you can > show an actual reproducer for it, then we might try to reproduce it > ourselves. > > As it is now, I don't trust what you've written here, because you clearly > haven't been honest about it, and you haven't shown the actual commands > you ran ("set -x output" of what??), let alone the actual output. >
You're absolutely precisely correct! messed up the real case with the transformed code one as it's in hurry, here fixed simplified one: unset b;u=7; o=(${u+ ! -path "./*.txt"}) ;b=($b "${o[@]}"); c=(. -regextype posix-extended "${b[@]}" -print); find "${c[@]}" absolutely work.. when deployed in a function in ~/.bashrc it failed as said so confusing why, what the glitch causing it