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

リダイレクトを変数に入れることはできません。代わりにシェルにコンテンツを実行させます。

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

コマンドラインが、次のように展開される単一のパラメーターで構成されている場合

$ $command

bash は次のことを行います。

  1. パラメータを展開し、結果に対して単語分割を実行します。
  2. 最初の単語を単純なコマンドとして実行し、残りの単語を引数として渡します。

それでおしまい。結果を任意のタイプの複合コマンドまたは変数の割り当てまたはリダイレクトとして処理するために、展開のそれ以上の解析は行われません。

より複雑なものはすべてevalコマンドに渡す必要がありますが、その仕組みを完全に理解し、任意の文字列を評価することのセキュリティへの影響を知っている場合に限ります。eval私の意見でevalは、便利ではなく、最後の手段と見なされるべきです。

于 2012-09-22T04:19:18.707 に答える