Les backticks comme des mots dans une boucle for résultent en un comportement étrange

6

Nous avons des problèmes de DNS dans notre bureau, alors j'ai essayé de trouver certains de nos serveurs par adresse IP:

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

s’attendant à ce que wget soit appelé avec 10.10.10.14 et 10.10.10.15

Au lieu de cela, wget est appelée avec 10.10.10.(some weird string which appears to be the expansion of $PS1), 10.10.10.$, 10.10.10.for, etc.

Si je fais juste

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

alors le résultat semble être comme prévu:

10.10.10.14
10.10.10.15

C'est une illusion cependant:

$ 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.|

La sortie est la même pour

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

il semble donc que l’utilisation de backticks n’est pas le problème en soi.

Qu'est-ce que je fais mal?

Bulletmagnet
la source
2
Avez-vous un DEBUGpiège? Quelle est la sortie de trap -p DEBUG?
Stéphane Chazelas
the for with wget - a fonctionné comme prévu sous Ubuntu le 16.04 avec le 4.3.48
Yaron
Bien vu, @ StéphaneChazelas! trap -- 'preexec_invoke_exec' DEBUG, dans "Prise en charge de Bash pour les fonctions preexec et precmd de type ZSH"
Bulletmagnet

Réponses:

11

Comme indiqué dans votre:

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

Vous avez un DEBUGpiège qui exécute des commandes avant chaque commande. À première vue, il semble que la preexec_invoke_execcommande tente (éventuellement) de mettre à jour le titre de votre émulateur de terminal avec la commande en cours d'exécution.

Cependant, pour ce faire, il écrit la séquence d'échappement sur stdout au lieu de sur le terminal.

Vous devez identifier où il fait cela et ajouter une > /dev/ttyredirection pour vous assurer qu'il est toujours envoyé au périphérique tty même lorsque stdout est redirigé comme dans cette $(...)substitution de commande.

Notez également que si cela preexec_invoke_execest destiné à imiter zsh« s preexec, il fait quelque chose de mal que le preexeccrochet zshest uniquement destiné à être exécuté une fois juste après une ligne de commande a été acceptée et avant qu'il ne soit exécuté, non pas pour chaque commande dans cette ligne de commande.

Stéphane Chazelas
la source