I have two folders under /tmp.
From terminal:
ls -d /tmp/firefox-*
/tmp/firefox-sy2vakcj.default-esr-charlie-cache
/tmp/firefox-sy2vakcj.default-esr-charlie-profile
or
compgen -G /tmp/firefox-*
/tmp/firefox-sy2vakcj.default-esr-charlie-cache
/tmp/firefox-sy2vakcj.default-esr-charlie-profile
And i can store the output in an array as well:
arr=( $(ls -d /tmp/firefox-*) )
echo $arr
tmp/firefox-sy2vakcj.default-esr-charlie-cache /tmp/firefox-sy2vakcj.default-esr-charlie-profile
echo $arr[1]
tmp/firefox-sy2vakcj.default-esr-charlie-cache
echo $arr[2]
/tmp/firefox-sy2vakcj.default-esr-charlie-profile
so far so good.
But if i attempt the same thing from a script:
...
...
arr=( "$(ls -d /tmp/firefox-*)" ) ||( echo "directory doesn't exist" && exit 1)
#arr=( "$(compgen -G /tmp/firefox-*)" ) ||( echo "directory doesn't exist" && exit 1)
echo "this is a test for arr[1]: $arr[1]"
echo "this is a test for arr[2]: $arr[2]"
...
I get the output:
From script:
for ls -d
this is the output:
+ arr=("$(ls -d /tmp/firefox-*)")
++ ls -d '/tmp/firefox-*'
ls: cannot access '/tmp/firefox-*': No such file or directory
+ echo 'directory doesn'\''t exist'
directory doesn't exist
and for compgen -G
, this is the output:
this is a test for arr[1]: /tmp/firefox-sy2vakcj.default-esr-charlie-cache
/tmp/firefox-sy2vakcj.default-esr-charlie-profile[1]
this is a test for arr[2]: /tmp/firefox-sy2vakcj.default-esr-charlie-cache
/tmp/firefox-sy2vakcj.default-esr-charlie-profile[2]
My questions:
1. Why is the glob not expanding in the subshell for the command ls -d
?
2. With compgen -G
, how are the values being stored in the array? the output seems like each entry in the array is storing both the directory entry with the second one with its own index array?
3. Is the output from terminal for both commands different from the script, or am i missing something?
${arr[1]}
-$arr[1]
(as you can see) is the same as$arr
followed by the literal string[1]
, and$arr
when used on an array is equal to the first array element. I would recommend shellcheck to check for such errors. – AdminBee Oct 19 '21 at 09:30echo $arr
andecho $arr[1]
looks like zsh. Except for the part where the first array element is missing the leading slash. Check to make sure what shell you're running, and copypaste the complete commands and their complete output, and if you're asking about scripts, include the complete script, and the complete command line you use to run the script. – ilkkachu Oct 19 '21 at 09:41zsh
which would explain part of what you're showing here as ilkkackhu pointed out. – terdon Oct 19 '21 at 09:46arr=('$(ls -d /tmp/firefox-*)')
? The output ofset -x
suggests you did. – terdon Oct 19 '21 at 09:56$arr
references. I changed to bash for testing. And the command substitution was the main problem (as pointed out by @AdminBee). Second issue was escaping the * glob. socompgen -G /tmp/firefox-\*
is the correct. Third, Bash index starts at 0 while for zsh it starts at 1 so that was another source of confusion. – Just Khaithang Oct 19 '21 at 11:03extglob
andgobalasciiranges
shell options turned on while the othersglobstar,dotglob,failglob,nocaseglob,nullglob
are turned off. I suspect it has to do with the subhsell not getting the required environment to expand the * glob – Just Khaithang Oct 19 '21 at 11:10bash script.sh
or/path/script.sh
). – terdon Oct 19 '21 at 11:39