0

我这样做效果很好

utnso@utnso-vm:~$ read command
ps -fea
utnso@utnso-vm:~$ $command
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 23:34 ?        00:00:02 /sbin/init
root         2     0  0 23:34 ?        00:00:00 [kthreadd]
root         3     2  0 23:34 ?        00:00:00 [ksoftirqd/0]
...

但是当试图运行这个命令时它失败了......

utnso@utnso-vm:~$ read command
ps -fea | grep bash
utnso@utnso-vm:~$ $command
ERROR: Garbage option.
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
T  all processes on this terminal     -s processes in the sessions given


   ...
    ...
    ...
    ...
                        ********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output       n  numeric WCHAN,UID  -H process hierarchy

有人知道怎么回事吗??

感谢先进!

4

2 回答 2

5

您不能将重定向放在变量中。让 shell 代替执行内容。

$ bash -c "$command"
于 2012-09-22T03:00:20.247 回答
4

当您的命令行包含要扩展的单个参数时,例如

$ $command

bash 执行以下操作:

  1. 展开参数,对结果进行分词。
  2. 将第一个单词作为简单命令执行,将其余单词作为参数传递。

就是这样。没有进一步解析扩展来将结果处理为任何类型的复合命令或变量赋值或重定向。

任何更复杂的东西都需要传递给eval命令,但前提是您完全了解其eval工作原理并了解评估任意字符串的安全含义。在我看来,eval应该算是不得已而为之的工具,而不是一种方便。

于 2012-09-22T04:19:18.707 回答