反引号作为 for 循环中的单词会导致奇怪的行为

反引号作为 for 循环中的单词会导致奇怪的行为

我们的办公室遇到了一些 DNS 问题,因此我尝试通过 IP 地址查找我们的一些服务器:

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

期望使用 10.10.10.14 和 10.10.10.15 调用 wget

相反,wget 是用10.10.10.(some weird string which appears to be the expansion of $PS1)10.10.10.$10.10.10.for等调用的。

如果我这样做

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

那么结果似乎符合预期:

10.10.10.14
10.10.10.15

然而,这是一种错觉:

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

输出是相同的

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

所以看来使用反引号本身并不是问题。

我究竟做错了什么?

答案1

如你的所示:

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

您有一个DEBUG在每个命令之前运行命令的陷阱。从外观上看,该preexec_invoke_exec命令(最终)似乎尝试使用正在运行的命令来更新终端模拟器的标题。

但是,为此,它将转义序列写入 stdout 而不是终端。

您应该确定它在哪里执行此操作并添加> /dev/tty重定向以确保它始终发送到 tty 设备,即使 stdout 像在该$(...)命令替换中一样被重定向。

另请注意,如果这preexec_invoke_exec意味着模拟zshs preexec,那么它会做错事,因为preexec挂钩 inzsh只意味着在接受命令行之后和运行之前执行一次,而不是针对该命令行中的每个命令执行一次。

相关内容