On Thu, 2019-05-16 at 12:57 -0400, Jerry Geis wrote:> I have a simple bash script it will take arguments from a file that has
> quotes.
>
> my file arg.txt would be this
> -lt "*.txt"
>
> my script file would be
> LS_ARG=`cat arg.txt`
> ls $LS_ARG
>
> it does not run properly:
> sh -x ./arg.sh
> ++ cat arg.txt
> + LS_ARG='-lt "*.txt"'
> + ls -lt '"*.txt"'
> ls: cannot access "*.txt": No such file or directory
>
>
> How do I resolve that ? If the quotes are not in my file it all works
> fine. I think its because it looks like the extra single quotes it puts
> around the "*.txt" - or - '"*.txt"' - how do I
do this ?
I think it's to do with when the wildcard * is expanded. The expansion
is not done by 'ls', it is done by the shell - so when you do 'ls
*',
ls doesn't see just the single argument '*', it sees multiple
arguments
consisting of the filenames. Using a simpler example, a shell script
'c' is:
#!/bin/bash
echo $#
echo "1:" $1
echo "2:" $2
i.e. it displays the number of and the first two arguments:
$ ./c *
4
1: a
2: a2
So there are 4 arguments (not just one) because there are four files in
the directory.
You can turn off the expansion (aka globbing) with 'set -f'
$ set -f ; ./c * ; set +f
1
1: *
2:
(But you also have to turn off globbing in the './c' script as well -
that's a subshell and globbing isn't inherited
#!/bin/bash
set -f
echo $#
echo "1:" $1
echo "2:" $2
if you don't turn off globbing in the script, when $1 - which contains
'*' - is echoed, it is expanded at that point.)
Putting quotes around the "*" stops the expansion - this is with
globbing turned off in the script:
$ ./c "*"
1
1: *
2:
Similarly, using ls:
$ ls *
a a2 arg.txt c
$ set -f ; ls * ; set +f
ls: cannot access '*': No such file or directory
$ ls "*"
ls: cannot access '*': No such file or directory
I don't know how this affects what you are trying to do though!
BTW, the single quotes you see when tracing the shell script is, I
think, just for display purposes, they aren't actually part of the
variables and are there just to show what is a single entity if there
is any doubt.
P.