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

Re: weird behaviour of quotes in dash variable assignments



On 2020-09-21 16:18, David Christensen wrote:
On 2020-09-21 09:34, Gary Dale wrote:

As an FYI, the scripts were the same on both servers because I had ssh sessions on both and copy/pasted the script from one to the other. (cat <script> on server 1, then use Konsole's copy and paste to select and paste it into nano on server 2).

That process may have changed the file in invisible ways.  Use hexdump(1) to check for differences.  See below examples.


Use scp(1), rsync(1), sshfs(1), a networked version control system such as cvs(1), etc., to copy files accurately.


On 2020-09-21 09:59, Gary Dale wrote:
> Most shells (all that I am aware of) treat tabs and blanks as generic
> white space - not relevant to the execution of the code.

"I guess so".  (Obviously, I am not a dash(1) shell scripting expert.)


I have greater confidence in my ability to copy files accurately, and thereby eliminate one set of potential problems.  If the problem does turn out to be spaces and tabs in code, hopefully the script will misbehave consistently and I will figure it out.


David



2020-09-21 13:01:00 dpchrist@tinkywinky ~
$ cat /etc/debian_version ; uname -a ; dpkg-query --show xfce4 ; dpkg-query --show vim
9.13
Linux tinkywinky 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64 GNU/Linux
xfce4    4.12.3
vim    2:8.0.0197-4+deb9u3


Test #1 -- copy and paste from cat(1) to vim(1)
===============================================

Terminal #1
-----------

2020-09-21 12:13:03 dpchrist@tinkywinky ~
$ vi foo

2020-09-21 12:13:54 dpchrist@tinkywinky ~
$ cat foo
I am foo!
    leading tab
Foo on you!
trailing tab

2020-09-21 12:13:57 dpchrist@tinkywinky ~
$ hexdump foo
00000000  49 20 61 6d 20 66 6f 6f  21 0a 09 6c 65 61 64 69  |I am foo!..leadi| 00000010  6e 67 20 74 61 62 0a 46  6f 6f 20 6f 6e 20 79 6f  |ng tab.Foo on yo| 00000020  75 21 0a 74 72 61 69 6c  69 6e 67 20 74 61 62 09 |u!.trailing tab.|
00000030  0a                                                |.|
00000031

<mouse drag and highlight cat(1) output>


Terminal #2
-----------

2020-09-21 12:01:15 dpchrist@tinkywinky ~
$ vi bar

<mouse middle click and paste text into edit buffer, save, exit>

2020-09-21 12:15:07 dpchrist@tinkywinky ~
$ cat bar
I am foo!
    leading tab
Foo on you!
trailing tab


2020-09-21 12:16:06 dpchrist@tinkywinky ~
$ hexdump bar
00000000  49 20 61 6d 20 66 6f 6f  21 0a 09 6c 65 61 64 69  |I am foo!..leadi| 00000010  6e 67 20 74 61 62 0a 46  6f 6f 20 6f 6e 20 79 6f  |ng tab.Foo on yo| 00000020  75 21 0a 74 72 61 69 6c  69 6e 67 20 74 61 62 09 |u!.trailing tab.|
00000030  0a 0a                                             |..|
00000032


Result: there is an extra newline at the end of 'bar'.


Test #2 -- copy and paste from less(1) to vim(1)
================================================

Terminal #3
-----------

2020-09-21 12:25:49 dpchrist@tinkywinky ~
$ less foo

<mouse drag and highlight text within less(1) display>


Terminal #4
-----------

2020-09-21 12:26:25 dpchrist@tinkywinky ~
$ vi baz

<mouse middle click and paste text into edit buffer, save, exit>

2020-09-21 13:06:14 dpchrist@tinkywinky ~
$ cat baz
I am foo!
        leading tab
Foo on you!
trailing tab

2020-09-21 13:06:16 dpchrist@tinkywinky ~
$ hexdump baz
00000000  49 20 61 6d 20 66 6f 6f  21 0a 20 20 20 20 20 20  |I am foo!.     | 00000010  20 20 6c 65 61 64 69 6e  67 20 74 61 62 0a 46 6f  | leading tab.Fo| 00000020  6f 20 6f 6e 20 79 6f 75  21 0a 74 72 61 69 6c 69  |o on you!.traili| 00000030  6e 67 20 74 61 62 20 20  20 20 0a 0a              |ng tab    ..|
0000003c


Result: Both tabs have been replaced with spaces and there is an extra newline at the end of 'baz'.

The two servers are for different customers. I would not want to create a tunnel between them. Instead I have my normal ssh tunnels to each server from my workstation. However the script is only readable by root while my tunnels are for my non-root account. While I could copy the file to my non-root account (while root), chown it, copy it to my workstation then to the other server, where I'd move it to /root, that's a lot more work than cat, copy, paste, save.

Again, the method I used should not have created any changes in the script that would affect its operation. And to date I've seen no indication that it did. I still don't know why the script was leaving the quotes in nor why it started working.


Reply to: