Backticks como palavras em um loop for resultam em comportamento estranho

6

Estamos com problemas de DNS no nosso escritório, por isso tentei encontrar alguns dos nossos servidores por endereço IP:

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

esperando que o wget seja chamado com 10.10.10.14 e 10.10.10.15

Em vez disso, o wget é chamado com 10.10.10.(some weird string which appears to be the expansion of $PS1) , 10.10.10.$ , 10.10.10.for , etc.

Se eu fizer apenas

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

o resultado parece ser o esperado:

10.10.10.14
10.10.10.15

Isso é uma ilusão, no entanto:

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

A saída é a mesma para

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

então parece que o uso de backticks não é o problema em si.

O que estou fazendo de errado?

    
por Bulletmagnet 07.08.2017 / 11:26

1 resposta

11

Como mostrado no seu:

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

Você tem um trap DEBUG que executa comandos antes de cada comando. Pelo jeito, parece que o comando preexec_invoke_exec (eventualmente) tenta atualizar o título do seu emulador de terminal com o comando sendo executado.

No entanto, para fazer isso, ele grava a seqüência de escape para stdout em vez de para o terminal.

Você deve identificar onde isso é feito e adicionar um redirecionamento > /dev/tty para garantir que seja sempre enviado ao dispositivo tty mesmo quando o stdout for redirecionado como dentro dessa substituição do comando $(...) .

Observe também que se preexec_invoke_exec for emular zsh preexec , estará fazendo algo errado, pois o preexec hook em zsh é destinado apenas a ser executado uma vez após uma linha de comando foi aceito e antes de ser executado, não para cada comando nessa linha de comando.

    
por 07.08.2017 / 12:04

Tags