:: Re: [DNG] bash / quote weirdness
Top Page
Delete this message
Reply to this message
Author: .
Date:  
To: dng
Subject: Re: [DNG] bash / quote weirdness

On Wed, 2022-01-12 at 00:08 +0100, Florian Zieboll via Dng wrote:
>> Dear list,
>>
>> this im my 'test.sh':
>>
>> #!/bin/bash
>> for f in "$@" ; do
>>      xcmd="unrar x"
>>      $xcmd "$f"
>> done

>>
>> Can please somebody explain, why, if I double-quote the "$xcmd"
>> variable in line 4, the script fails with
>>
>>     ./test.sh: line 4: unrar x: command not found

>>
>> ???
>>
>> Commands without parameters resp. whitespace (e.g. xcmd="unzip") work
>> fine when double-quoted; a web search (including the "GNU Bash
>> manual"
>> [1]) did not shed any light on this mystery...
>>
>> Thank you and libre Grüße,
>> Florian
>>
>>
>> ------------------------------
>>
>> Message: 2
>> Date: Thu, 13 Jan 2022 09:07:22 -0500
>> From: Hendrik Boom <hendrik@???>
>> To: dng@???
>> Subject: Re: [DNG] [OT] bash / quote weirdness
>> Message-ID: <20220113140722.GA30938@???>
>> Content-Type: text/plain; charset=us-ascii
>>
>> On Wed, Jan 12, 2022 at 05:45:08PM -0500, Steve Litt wrote:
>> On the other hand...
>>
>> =======================================
>> [slitt@mydesk ~]$ cat -n /etc/fstab | cut -b 1-20 |  head -n5
>>       1    UUID=730eaf92
>>       2    UUID=41abb5fd
>>       3    UUID=96cfdfb3
>>       4    UUID=6F66-BF7
>>       5    tmpfs /tmp tm
>> [slitt@mydesk ~]$ "cat -n" /etc/fstab | cut -b 1-20 |  head -n5
>> bash: cat -n: command not found
>> [slitt@mydesk ~]$ "cat -n /etc/fstab" | cut -b 1-20 |  head -n5
>> bash: cat -n /etc/fstab: No such file or directory
>> [slitt@mydesk ~]$
> So if it has parameters it's a command, and if it diesn't it's just
> a file or directory?

>
> -- hendrik
>
>
> ------------------------------
>
> Message: 3
> Date: Thu, 13 Jan 2022 15:43:29 +0100
> From: Antony Stone <Antony.Stone@???>
> To: dng@???
> Subject: Re: [DNG] [OT] bash / quote weirdness
> Message-ID: <202201131543.29980.Antony.Stone@???>
> Content-Type: Text/Plain; charset="utf-8"
>
> On Thursday 13 January 2022 at 15:07:22, Hendrik Boom wrote:
>
>> On Wed, Jan 12, 2022 at 05:45:08PM -0500, Steve Litt wrote:
>>> [slitt@mydesk ~]$ cat -n /etc/fstab | cut -b 1-20 | head -n5
>>>
>>>       1    UUID=730eaf92
>>>       2    UUID=41abb5fd
>>>       3    UUID=96cfdfb3
>>>       4    UUID=6F66-BF7
>>>       5    tmpfs /tmp tm

>>>
>>> [slitt@mydesk ~]$ "cat -n" /etc/fstab | cut -b 1-20 | head -n5
>>> bash: cat -n: command not found
>>>
>>> [slitt@mydesk ~]$ "cat -n /etc/fstab" | cut -b 1-20 | head -n5
>>> bash: cat -n /etc/fstab: No such file or directory
>> So if it has parameters it's a command, and if it diesn't it's just
>> a file or directory?
> It looks a good deal more complicated than that...
>
> $ "cat /etc/fstab"
> bash: cat /etc/fstab: No such file or directory
>
> $ "cat fstab"
> bash: cat fstab: command not found
>
> I have no idea what's really going on here.
>
>
> Antony.


The shell receives a series of tokens, and tries to interpret the first
one as a command.  In the double-quoted attempt above, it gets two
tokens before the first pipe | ---

    1) "cat -n"

    2) /etc/fstab

Of course, the system has no command named "cat -n".  (And only a
chaotic evil person would use a space in a command's name.) Something like
    "cat"  "-n"  /etc/fstab
would work fine, the shell now sees three tokens (and the double quotes
are completely unnecessary here), and the first is recognized as a
command that's on the executable path.

The same goes for "cat /etc/fstab" or "cat fstab", they're both just
text strings that happen to include a space character.