Bash – Backticks as words in a for loop result in strange behavior

bashshell

We're having some DNS problems in our office, so I tried finding some of our servers by IP address:

for i in `seq 14 15`; do echo "10.10.10.$i" ;  wget "10.10.10.$i"  ; done

expecting that wget will be called with 10.10.10.14 and 10.10.10.15

Instead, wget is called with 10.10.10.(some weird string which appears to be the expansion of $PS1), 10.10.10.$, 10.10.10.for, etc.

If I do just

for i in `seq 14 15`; do echo "10.10.10.$i" ;  done

then the result appears to be as expected:

10.10.10.14
10.10.10.15

This is an illusion however:

$ for i in `seq 14 15` ; do echo  $i ; done | hexdump -C
00000000  1b 5d 30 3b 43 53 21 40  3a 2f 74 6d 70 20 24 20  |.]0;CS!@:/tmp $ |
00000010  66 6f 72 20 69 20 69 6e  20 60 73 65 71 20 31 34  |for i in `seq 14|
00000020  20 31 35 60 20 3b 20 64  6f 20 65 63 68 6f 20 20  | 15` ; do echo  |
00000030  24 69 20 3b 20 64 6f 6e  65 20 7c 20 68 65 78 64  |$i ; done | hexd|
00000040  75 6d 70 20 2d 43 07 1b  5d 30 3b 43 53 21 40 3a  |ump -C..]0;CS!@:|
00000050  2f 74 6d 70 20 24 20 66  6f 72 20 69 20 69 6e 20  |/tmp $ for i in |
00000060  60 73 65 71 20 31 34 20  31 35 60 20 3b 20 64 6f  |`seq 14 15` ; do|
00000070  20 65 63 68 6f 20 20 24  69 20 3b 20 64 6f 6e 65  | echo  $i ; done|
00000080  20 7c 20 68 65 78 64 75  6d 70 20 2d 43 07 1b 5d  | | hexdump -C..]|
00000090  30 3b 43 53 21 40 3a 2f  74 6d 70 0a 1b 5d 30 3b  |0;CS!@:/tmp..]0;|
000000a0  43 53 21 40 3a 2f 74 6d  70 20 24 20 66 6f 72 20  |CS!@:/tmp $ for |
000000b0  69 20 69 6e 20 60 73 65  71 20 31 34 20 31 35 60  |i in `seq 14 15`|
000000c0  20 3b 20 64 6f 20 65 63  68 6f 20 20 24 69 20 3b  | ; do echo  $i ;|
000000d0  20 64 6f 6e 65 20 7c 20  68 65 78 64 75 6d 70 20  | done | hexdump |
000000e0  2d 43 07 1b 5d 30 3b 43  53 21 40 3a 2f 74 6d 70  |-C..]0;CS!@:/tmp|
000000f0  20 24 20 66 6f 72 20 69  20 69 6e 20 60 73 65 71  | $ for i in `seq|
00000100  20 31 34 20 31 35 60 20  3b 20 64 6f 20 65 63 68  | 14 15` ; do ech|
00000110  6f 20 20 24 69 20 3b 20  64 6f 6e 65 20 7c 20 68  |o  $i ; done | h|
00000120  65 78 64 75 6d 70 20 2d  43 07 24 0a 1b 5d 30 3b  |exdump -C.$..]0;|
00000130  43 53 21 40 3a 2f 74 6d  70 20 24 20 66 6f 72 20  |CS!@:/tmp $ for |
00000140  69 20 69 6e 20 60 73 65  71 20 31 34 20 31 35 60  |i in `seq 14 15`|
00000150  20 3b 20 64 6f 20 65 63  68 6f 20 20 24 69 20 3b  | ; do echo  $i ;|
00000160  20 64 6f 6e 65 20 7c 20  68 65 78 64 75 6d 70 20  | done | hexdump |
00000170  2d 43 07 1b 5d 30 3b 43  53 21 40 3a 2f 74 6d 70  |-C..]0;CS!@:/tmp|
00000180  20 24 20 66 6f 72 20 69  20 69 6e 20 60 73 65 71  | $ for i in `seq|
00000190  20 31 34 20 31 35 60 20  3b 20 64 6f 20 65 63 68  | 14 15` ; do ech|
000001a0  6f 20 20 24 69 20 3b 20  64 6f 6e 65 20 7c 20 68  |o  $i ; done | h|
000001b0  65 78 64 75 6d 70 20 2d  43 07 66 6f 72 0a 1b 5d  |exdump -C.for..]|
000001c0  30 3b 43 53 21 40 3a 2f  74 6d 70 20 24 20 66 6f  |0;CS!@:/tmp $ fo|
000001d0  72 20 69 20 69 6e 20 60  73 65 71 20 31 34 20 31  |r i in `seq 14 1|
000001e0  35 60 20 3b 20 64 6f 20  65 63 68 6f 20 20 24 69  |5` ; do echo  $i|
000001f0  20 3b 20 64 6f 6e 65 20  7c 20 68 65 78 64 75 6d  | ; done | hexdum|
00000200  70 20 2d 43 07 1b 5d 30  3b 43 53 21 40 3a 2f 74  |p -C..]0;CS!@:/t|
00000210  6d 70 20 24 20 66 6f 72  20 69 20 69 6e 20 60 73  |mp $ for i in `s|
00000220  65 71 20 31 34 20 31 35  60 20 3b 20 64 6f 20 65  |eq 14 15` ; do e|
00000230  63 68 6f 20 20 24 69 20  3b 20 64 6f 6e 65 20 7c  |cho  $i ; done ||
00000240  20 68 65 78 64 75 6d 70  20 2d 43 07 69 0a 1b 5d  | hexdump -C.i..]|
00000250  30 3b 43 53 21 40 3a 2f  74 6d 70 20 24 20 66 6f  |0;CS!@:/tmp $ fo|
00000260  72 20 69 20 69 6e 20 60  73 65 71 20 31 34 20 31  |r i in `seq 14 1|
00000270  35 60 20 3b 20 64 6f 20  65 63 68 6f 20 20 24 69  |5` ; do echo  $i|
00000280  20 3b 20 64 6f 6e 65 20  7c 20 68 65 78 64 75 6d  | ; done | hexdum|
00000290  70 20 2d 43 07 1b 5d 30  3b 43 53 21 40 3a 2f 74  |p -C..]0;CS!@:/t|
000002a0  6d 70 20 24 20 66 6f 72  20 69 20 69 6e 20 60 73  |mp $ for i in `s|
000002b0  65 71 20 31 34 20 31 35  60 20 3b 20 64 6f 20 65  |eq 14 15` ; do e|
000002c0  63 68 6f 20 20 24 69 20  3b 20 64 6f 6e 65 20 7c  |cho  $i ; done ||
000002d0  20 68 65 78 64 75 6d 70  20 2d 43 07 69 6e 0a 1b  | hexdump -C.in..|
000002e0  5d 30 3b 43 53 21 40 3a  2f 74 6d 70 20 24 20 66  |]0;CS!@:/tmp $ f|
000002f0  6f 72 20 69 20 69 6e 20  60 73 65 71 20 31 34 20  |or i in `seq 14 |
00000300  31 35 60 20 3b 20 64 6f  20 65 63 68 6f 20 20 24  |15` ; do echo  $|
00000310  69 20 3b 20 64 6f 6e 65  20 7c 20 68 65 78 64 75  |i ; done | hexdu|
00000320  6d 70 20 2d 43 07 1b 5d  30 3b 43 53 21 40 3a 2f  |mp -C..]0;CS!@:/|
00000330  74 6d 70 20 24 20 66 6f  72 20 69 20 69 6e 20 60  |tmp $ for i in `|
00000340  73 65 71 20 31 34 20 31  35 60 20 3b 20 64 6f 20  |seq 14 15` ; do |
00000350  65 63 68 6f 20 20 24 69  20 3b 20 64 6f 6e 65 20  |echo  $i ; done |
00000360  7c 20 68 65 78 64 75 6d  70 20 2d 43 07 60 73 65  || hexdump -C.`se|
00000370  71 0a 1b 5d 30 3b 43 53  21 40 3a 2f 74 6d 70 20  |q..]0;CS!@:/tmp |
00000380  24 20 66 6f 72 20 69 20  69 6e 20 60 73 65 71 20  |$ for i in `seq |
00000390  31 34 20 31 35 60 20 3b  20 64 6f 20 65 63 68 6f  |14 15` ; do echo|
000003a0  20 20 24 69 20 3b 20 64  6f 6e 65 20 7c 20 68 65  |  $i ; done | he|
000003b0  78 64 75 6d 70 20 2d 43  07 1b 5d 30 3b 43 53 21  |xdump -C..]0;CS!|
000003c0  40 3a 2f 74 6d 70 20 24  20 66 6f 72 20 69 20 69  |@:/tmp $ for i i|
000003d0  6e 20 60 73 65 71 20 31  34 20 31 35 60 20 3b 20  |n `seq 14 15` ; |
000003e0  64 6f 20 65 63 68 6f 20  20 24 69 20 3b 20 64 6f  |do echo  $i ; do|
000003f0  6e 65 20 7c 20 68 65 78  64 75 6d 70 20 2d 43 07  |ne | hexdump -C.|
00000400  31 34 0a 1b 5d 30 3b 43  53 21 40 3a 2f 74 6d 70  |14..]0;CS!@:/tmp|
00000410  20 24 20 66 6f 72 20 69  20 69 6e 20 60 73 65 71  | $ for i in `seq|
00000420  20 31 34 20 31 35 60 20  3b 20 64 6f 20 65 63 68  | 14 15` ; do ech|
00000430  6f 20 20 24 69 20 3b 20  64 6f 6e 65 20 7c 20 68  |o  $i ; done | h|
00000440  65 78 64 75 6d 70 20 2d  43 07 1b 5d 30 3b 43 53  |exdump -C..]0;CS|
00000450  21 40 3a 2f 74 6d 70 20  24 20 66 6f 72 20 69 20  |!@:/tmp $ for i |
00000460  69 6e 20 60 73 65 71 20  31 34 20 31 35 60 20 3b  |in `seq 14 15` ;|
00000470  20 64 6f 20 65 63 68 6f  20 20 24 69 20 3b 20 64  | do echo  $i ; d|
00000480  6f 6e 65 20 7c 20 68 65  78 64 75 6d 70 20 2d 43  |one | hexdump -C|
00000490  07 31 35 60 0a 1b 5d 30  3b 43 53 21 40 3a 2f 74  |.15`..]0;CS!@:/t|
000004a0  6d 70 20 24 20 66 6f 72  20 69 20 69 6e 20 60 73  |mp $ for i in `s|
000004b0  65 71 20 31 34 20 31 35  60 20 3b 20 64 6f 20 65  |eq 14 15` ; do e|
000004c0  63 68 6f 20 20 24 69 20  3b 20 64 6f 6e 65 20 7c  |cho  $i ; done ||
000004d0  20 68 65 78 64 75 6d 70  20 2d 43 07 1b 5d 30 3b  | hexdump -C..]0;|
000004e0  43 53 21 40 3a 2f 74 6d  70 20 24 20 66 6f 72 20  |CS!@:/tmp $ for |
000004f0  69 20 69 6e 20 60 73 65  71 20 31 34 20 31 35 60  |i in `seq 14 15`|
00000500  20 3b 20 64 6f 20 65 63  68 6f 20 20 24 69 20 3b  | ; do echo  $i ;|
00000510  20 64 6f 6e 65 20 7c 20  68 65 78 64 75 6d 70 20  | done | hexdump |
00000520  2d 43 07 3b 0a 1b 5d 30  3b 43 53 21 40 3a 2f 74  |-C.;..]0;CS!@:/t|
00000530  6d 70 20 24 20 66 6f 72  20 69 20 69 6e 20 60 73  |mp $ for i in `s|
00000540  65 71 20 31 34 20 31 35  60 20 3b 20 64 6f 20 65  |eq 14 15` ; do e|
00000550  63 68 6f 20 20 24 69 20  3b 20 64 6f 6e 65 20 7c  |cho  $i ; done ||
00000560  20 68 65 78 64 75 6d 70  20 2d 43 07 1b 5d 30 3b  | hexdump -C..]0;|
00000570  43 53 21 40 3a 2f 74 6d  70 20 24 20 66 6f 72 20  |CS!@:/tmp $ for |
00000580  69 20 69 6e 20 60 73 65  71 20 31 34 20 31 35 60  |i in `seq 14 15`|
00000590  20 3b 20 64 6f 20 65 63  68 6f 20 20 24 69 20 3b  | ; do echo  $i ;|
000005a0  20 64 6f 6e 65 20 7c 20  68 65 78 64 75 6d 70 20  | done | hexdump |
000005b0  2d 43 07 64 6f 0a 1b 5d  30 3b 43 53 21 40 3a 2f  |-C.do..]0;CS!@:/|
000005c0  74 6d 70 20 24 20 66 6f  72 20 69 20 69 6e 20 60  |tmp $ for i in `|
000005d0  73 65 71 20 31 34 20 31  35 60 20 3b 20 64 6f 20  |seq 14 15` ; do |
000005e0  65 63 68 6f 20 20 24 69  20 3b 20 64 6f 6e 65 20  |echo  $i ; done |
000005f0  7c 20 68 65 78 64 75 6d  70 20 2d 43 07 1b 5d 30  || hexdump -C..]0|
00000600  3b 43 53 21 40 3a 2f 74  6d 70 20 24 20 66 6f 72  |;CS!@:/tmp $ for|
00000610  20 69 20 69 6e 20 60 73  65 71 20 31 34 20 31 35  | i in `seq 14 15|
00000620  60 20 3b 20 64 6f 20 65  63 68 6f 20 20 24 69 20  |` ; do echo  $i |
00000630  3b 20 64 6f 6e 65 20 7c  20 68 65 78 64 75 6d 70  |; done | hexdump|
00000640  20 2d 43 07 65 63 68 6f  0a 1b 5d 30 3b 43 53 21  | -C.echo..]0;CS!|
00000650  40 3a 2f 74 6d 70 20 24  20 66 6f 72 20 69 20 69  |@:/tmp $ for i i|
00000660  6e 20 60 73 65 71 20 31  34 20 31 35 60 20 3b 20  |n `seq 14 15` ; |
00000670  64 6f 20 65 63 68 6f 20  20 24 69 20 3b 20 64 6f  |do echo  $i ; do|
00000680  6e 65 20 7c 20 68 65 78  64 75 6d 70 20 2d 43 07  |ne | hexdump -C.|
00000690  1b 5d 30 3b 43 53 21 40  3a 2f 74 6d 70 20 24 20  |.]0;CS!@:/tmp $ |
000006a0  66 6f 72 20 69 20 69 6e  20 60 73 65 71 20 31 34  |for i in `seq 14|
000006b0  20 31 35 60 20 3b 20 64  6f 20 65 63 68 6f 20 20  | 15` ; do echo  |
000006c0  24 69 20 3b 20 64 6f 6e  65 20 7c 20 68 65 78 64  |$i ; done | hexd|
000006d0  75 6d 70 20 2d 43 07 24  69 0a 1b 5d 30 3b 43 53  |ump -C.$i..]0;CS|
000006e0  21 40 3a 2f 74 6d 70 20  24 20 66 6f 72 20 69 20  |!@:/tmp $ for i |
000006f0  69 6e 20 60 73 65 71 20  31 34 20 31 35 60 20 3b  |in `seq 14 15` ;|
00000700  20 64 6f 20 65 63 68 6f  20 20 24 69 20 3b 20 64  | do echo  $i ; d|
00000710  6f 6e 65 20 7c 20 68 65  78 64 75 6d 70 20 2d 43  |one | hexdump -C|
00000720  07 1b 5d 30 3b 43 53 21  40 3a 2f 74 6d 70 20 24  |..]0;CS!@:/tmp $|
00000730  20 66 6f 72 20 69 20 69  6e 20 60 73 65 71 20 31  | for i in `seq 1|
00000740  34 20 31 35 60 20 3b 20  64 6f 20 65 63 68 6f 20  |4 15` ; do echo |
00000750  20 24 69 20 3b 20 64 6f  6e 65 20 7c 20 68 65 78  | $i ; done | hex|
00000760  64 75 6d 70 20 2d 43 07  3b 0a 1b 5d 30 3b 43 53  |dump -C.;..]0;CS|
00000770  21 40 3a 2f 74 6d 70 20  24 20 66 6f 72 20 69 20  |!@:/tmp $ for i |
00000780  69 6e 20 60 73 65 71 20  31 34 20 31 35 60 20 3b  |in `seq 14 15` ;|
00000790  20 64 6f 20 65 63 68 6f  20 20 24 69 20 3b 20 64  | do echo  $i ; d|
000007a0  6f 6e 65 20 7c 20 68 65  78 64 75 6d 70 20 2d 43  |one | hexdump -C|
000007b0  07 1b 5d 30 3b 43 53 21  40 3a 2f 74 6d 70 20 24  |..]0;CS!@:/tmp $|
000007c0  20 66 6f 72 20 69 20 69  6e 20 60 73 65 71 20 31  | for i in `seq 1|
000007d0  34 20 31 35 60 20 3b 20  64 6f 20 65 63 68 6f 20  |4 15` ; do echo |
000007e0  20 24 69 20 3b 20 64 6f  6e 65 20 7c 20 68 65 78  | $i ; done | hex|
000007f0  64 75 6d 70 20 2d 43 07  64 6f 6e 65 0a 1b 5d 30  |dump -C.done..]0|
00000800  3b 43 53 21 40 3a 2f 74  6d 70 20 24 20 66 6f 72  |;CS!@:/tmp $ for|
00000810  20 69 20 69 6e 20 60 73  65 71 20 31 34 20 31 35  | i in `seq 14 15|
00000820  60 20 3b 20 64 6f 20 65  63 68 6f 20 20 24 69 20  |` ; do echo  $i |
00000830  3b 20 64 6f 6e 65 20 7c  20 68 65 78 64 75 6d 70  |; done | hexdump|
00000840  20 2d 43 07 1b 5d 30 3b  43 53 21 40 3a 2f 74 6d  | -C..]0;CS!@:/tm|
00000850  70 20 24 20 66 6f 72 20  69 20 69 6e 20 60 73 65  |p $ for i in `se|
00000860  71 20 31 34 20 31 35 60  20 3b 20 64 6f 20 65 63  |q 14 15` ; do ec|
00000870  68 6f 20 20 24 69 20 3b  20 64 6f 6e 65 20 7c 20  |ho  $i ; done | |
00000880  68 65 78 64 75 6d 70 20  2d 43 07 7c 0a 1b 5d 30  |hexdump -C.|..]0|
00000890  3b 43 53 21 40 3a 2f 74  6d 70 20 24 20 66 6f 72  |;CS!@:/tmp $ for|
000008a0  20 69 20 69 6e 20 60 73  65 71 20 31 34 20 31 35  | i in `seq 14 15|
000008b0  60 20 3b 20 64 6f 20 65  63 68 6f 20 20 24 69 20  |` ; do echo  $i |
000008c0  3b 20 64 6f 6e 65 20 7c  20 68 65 78 64 75 6d 70  |; done | hexdump|
000008d0  20 2d 43 07 1b 5d 30 3b  43 53 21 40 3a 2f 74 6d  | -C..]0;CS!@:/tm|
000008e0  70 20 24 20 66 6f 72 20  69 20 69 6e 20 60 73 65  |p $ for i in `se|
000008f0  71 20 31 34 20 31 35 60  20 3b 20 64 6f 20 65 63  |q 14 15` ; do ec|
00000900  68 6f 20 20 24 69 20 3b  20 64 6f 6e 65 20 7c 20  |ho  $i ; done | |
00000910  68 65 78 64 75 6d 70 20  2d 43 07 68 65 78 64 75  |hexdump -C.hexdu|
00000920  6d 70 0a 1b 5d 30 3b 43  53 21 40 3a 2f 74 6d 70  |mp..]0;CS!@:/tmp|
00000930  20 24 20 66 6f 72 20 69  20 69 6e 20 60 73 65 71  | $ for i in `seq|
00000940  20 31 34 20 31 35 60 20  3b 20 64 6f 20 65 63 68  | 14 15` ; do ech|
00000950  6f 20 20 24 69 20 3b 20  64 6f 6e 65 20 7c 20 68  |o  $i ; done | h|
00000960  65 78 64 75 6d 70 20 2d  43 07 1b 5d 30 3b 43 53  |exdump -C..]0;CS|
00000970  21 40 3a 2f 74 6d 70 20  24 20 66 6f 72 20 69 20  |!@:/tmp $ for i |
00000980  69 6e 20 60 73 65 71 20  31 34 20 31 35 60 20 3b  |in `seq 14 15` ;|
00000990  20 64 6f 20 65 63 68 6f  20 20 24 69 20 3b 20 64  | do echo  $i ; d|
000009a0  6f 6e 65 20 7c 20 68 65  78 64 75 6d 70 20 2d 43  |one | hexdump -C|
000009b0  07 2d 43 07 31 34 0a 1b  5d 30 3b 43 53 21 40 3a  |.-C.14..]0;CS!@:|
000009c0  2f 74 6d 70 20 24 20 66  6f 72 20 69 20 69 6e 20  |/tmp $ for i in |
000009d0  60 73 65 71 20 31 34 20  31 35 60 20 3b 20 64 6f  |`seq 14 15` ; do|
000009e0  20 65 63 68 6f 20 20 24  69 20 3b 20 64 6f 6e 65  | echo  $i ; done|
000009f0  20 7c 20 68 65 78 64 75  6d 70 20 2d 43 07 1b 5d  | | hexdump -C..]|
00000a00  30 3b 43 53 21 40 3a 2f  74 6d 70 20 24 20 66 6f  |0;CS!@:/tmp $ fo|
00000a10  72 20 69 20 69 6e 20 60  73 65 71 20 31 34 20 31  |r i in `seq 14 1|
00000a20  35 60 20 3b 20 64 6f 20  65 63 68 6f 20 20 24 69  |5` ; do echo  $i|
00000a30  20 3b 20 64 6f 6e 65 20  7c 20 68 65 78 64 75 6d  | ; done | hexdum|
00000a40  70 20 2d 43 07 31 35 0a                           |p -C.15.|

The output is the same for

for i in $(seq 14 15) ; do echo  $i ; done | hexdump -C

so it appears that the use of backticks is not the problem in itself.

What am I doing wrong?

Best Answer

As shown in your:

$ trap -p DEBUG
trap -- 'preexec_invoke_exec' DEBUG

You've got a DEBUG trap that runs commands before each command. By the look of it, it seems that preexec_invoke_exec command (eventually) tries to update the title of your terminal emulator with the command being run.

However, to do that, it writes the escape sequence to stdout instead of to the terminal.

You should identify where it does that and add a > /dev/tty redirection to make sure it's always sent to the tty device even when stdout is redirected like inside that $(...) command substitution.

Also note that if that preexec_invoke_exec is meant to emulate zsh's preexec, it's doing something wrong as the preexec hook in zsh is only meant to be executed once just after a command line has been accepted and before it is run, not for each command in that command line.

Related Question