1

bash ファイルにいくつかのコマンドを実行し、入力を無視する必要があります。

pvs --noheadings -o pv_name,vg_name,vg_size 2> /dev/null

上記のコマンドはコマンドラインではうまく機能しますが、シェルで同じことを書くとエラーが発生します

お気に入り

Failed to read physical volume "2>"
Failed to read physical volume "/dev/null"

コマンド全体の一部として見えると思います。それを修正する方法についていくつかの提案を教えてください。

前もって感謝します。

フルコード

# ------------------------------

main() {
    pv_cmd='pvs'
    nh='--noheadings'
    sp=' '
    op='-o'
    vgn='vg_name'
    pvn='pv_name'
    pvz='pv_size'
    cm=','
    tonull=' 2 > /dev/null '
    pipe='|'

    #cmd=$pv_cmd$sp$nh$sp$op$sp$vgn$cm$pvn$cm$pvz$sp$pipe$tonull  #line A
    cmd='pvs --noheadings -o vg_name,pv_name,pv_size 2> /dev/null' #line B
    echo -n "Cmd="
    echo $cmd
    $cmd

}

主要

#------------------------------------------------- ----

Line A & B を見ると、両方のバージョンがありますが、一方はコメントアウトされています.....

4

4 に答える 4

2

引用符で囲まれた文字列内に 2> /dev/null を含めることはできません。引用符の削除は、リダイレクトが処理された後に行われます。あなたがしなければならないでしょう

cmd='pvs --noheadings -o vg_name,pv_name,pv_size'
$cmd 2> /dev/null

リダイレクトが正しく機能するようにします。

于 2012-07-12T19:46:39.477 に答える
1

2> と /dev/null は引数として解析されます。しかし、2> /dev/null をプログラム引数ではなく bash コードにしたいので、

それ以外の

 $cmd

あなたがすべき

 eval $cmd

それが物事の仕組みです。

または、エコーがデバッグ用の場合は、コマンドの前に -o xtrace を設定し、コマンドの後に +o xtrace を設定するだけです。文字列を詰め込む代わりに、通常の方法でそれを行います。

于 2012-07-12T20:15:08.130 に答える
0

何が起こっているのかというと、私たちには見えないか、表示されているもの>とは異なる文字が線の中にあるということです。結局のところ、シェルはコマンドがリダイレクトを認識する前にリダイレクトを飲み込む必要がありますが、コマンドは2>and /dev/nullas を認識し[PhysicalVolume [PhysicalVolume...]]ます。別の方法として、リダイレクトを引用して渡すこともできます (そのため、シェルにとって特別な意味が失われ、渡されます)。chepner の回答を参照してください。


tonull=' 2 > /dev/null '

が問題です。まさにチェプナーの推測通り。

于 2012-07-12T19:47:20.443 に答える
-1

2と>の間のスペースを削除します

pvs --noheadings -o pv_name,vg_name,vg_size 2>/dev/null
于 2012-07-12T19:24:04.540 に答える