Re: bash off topic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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.




_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
https://lists.centos.org/mailman/listinfo/centos



[Index of Archives]     [CentOS]     [CentOS Announce]     [CentOS Development]     [CentOS ARM Devel]     [CentOS Docs]     [CentOS Virtualization]     [Carrier Grade Linux]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Linux USB]


  Powered by Linux