bash:不明白这两种方法的区别 - 应该是一样的,但不是......?

bash: don't understand the difference between these two methods - should be the same, but isn't...?

我有一个文件:$ cat /tmp/test.txt<br> 1 "African Countries AFR" 2 "Albania AL" 3 "Arab Countries ARB" 4 "Austria AT"

我正在尝试学习这个 linux-实用程序,但这显然是错误的:

$ dialog --menu "Choose toppings:" 35 35 5 $(cat /tmp/test.txt)

                                  │ │    1          "African      │ │  
                                  │ │    Countries  AFR"          │ │  
                                  │ │    2          "Albania      │ │  
                                  │ │    AL"        3             │ │  
                                  │ │    "Arab      Countries     │ │  
                                  │ │    ARB"       4             │ │  
                                  │ │    "Austria   AT"           │ │  

所以我想我应该试试不换行:

$ dialog --menu "Choose toppings:" 35 35 5 $(cat /tmp/test.txt | tr -d '\n')

但这也是错误的(结果同上)!经过一番努力之后,我决定尝试手动添加内容并将它们作为参数输入命令行:

$ cat /tmp/test.txt | tr -d '\n'
     1 "African Countries AFR"     2 "Albania AL"     3 "Arab Countries ARB"     4 "Austria AT"

这是命令行和结果:

$ dialog --menu "Choose toppings:" 30 35 5   1 "African Countries AFR"     2 "Albania AL"     3 "Arab Countries ARB"     4 "Austria AT"

                                  │ │  1  African Countries AFR   │ │  
                                  │ │  2  Albania AL              │ │  
                                  │ │  3  Arab Countries ARB      │ │  
                                  │ │  4  Austria AT              │ │  

结果突然就正确了 - 为什么?

以及如何修改行 "dialog --menu "Choose toppings:" 35 35 5 $(cat /tmp/test.txt | tr -d '\n')" 以便给出正确的结果?

使用 --file 选项:

dialog --menu "Choose toppings:" 35 35 5 --file /tmp/test.txt

正如你所说,通常还有另一种方式......

cat << EOF > magic
dialog --menu "Choose toppings:" 35 35 5 $(test.txt | tr '\n' ' ')
EOF

. magic

或者如果您愿意使用 eval:

eval $(cat << EOF
dialog --menu "Choose toppings:" 35 35 5 $(test.txt | tr '\n' ' ')
EOF

)