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.echo $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.zsh
which would explain part of what you're showing here as ilkkackhu pointed out.