1

ここに私は再びいます。今日、私は自分の debian 環境でアプリケーションをサイレント モードで起動することになっている小さなスクリプトを書きました。簡単に

silent "npm search 1234556"

これは機能しますが、まったく機能しません。ご覧のとおり、いくつか問題があるセクションにコメントしました。

この行:

$($cmdLine) &

アプリケーションの出力を隠しませんが、これは

$($1 >/dev/null 2>/dev/null) &

完璧に動作します。私は何が欠けていますか?どうもありがとう。

#!/bin/sh

# Daniele Brugnara
# October, 2013

# Silently exec a command line passed as argument

errorsRedirect=""

if [ -z "$1" ]; then
        echo "Please, don't joke me..."
        exit 1
fi

cmdLine="$1 >/dev/null"

# if passed a second parameter, errors will be hidden
if [ -n "$2" ]; then
        cmdLine="$cmdLine 2>/dev/null"
fi

# not working
$($cmdLine) &

# works perfectly
#$($1 >/dev/null 2>/dev/null) &
4

4 に答える 4

2

最後にリダイレクトを追加してコマンドを作成するのではなく、段階的に適用できます。

#!/bin/sh

if [ -z "$1" ]; then
    exit
fi

exec >/dev/null
if [ -n "$2" ]; then
    exec 2>&1
fi

exec $1

これにより、最初にシェル スクリプトの stdout が /dev/null にリダイレクトされます。2 番目の引数を指定すると、シェル スクリプトの stderr もリダイレクトされます。次に、スクリプトから stdout と stderr を継承するコマンドを実行します。

アンパサンド (&) を削除しました。サイレントであることは、バックグラウンドでの実行とは関係がないためです。exec必要に応じて、追加し直すことができます (最後の行のを削除します)。

exec少し効率が良いので、最後に追加しました。これでシェルスクリプトは終了なので、何もする必要はありませんexec

于 2013-10-03T09:55:23.617 に答える
1

コマンド ラインを var に作成し、それを使用してバックグラウンドで bash を実行できます。

bash -c "$cmdLine"&

プログラムの出力 (out/err) を null に格納するのではなく、格納すると便利な場合があることに注意してください。さらに、なぜerrorsRedirectが必要なのですか?? 安全のために、最後に待機を追加することもできます...必要に応じて...

#!/bin/sh

# Daniele Brugnara
# October, 2013

# Silently exec a command line passed as argument

[ ! $1 ] && echo "Please, don't joke me..." && exit 1
cmdLine="$1>/dev/null"
# if passed a second parameter, errors will be hidden
[ $2 ] && cmdLine+=" 2>/dev/null"
# not working
echo "Running \"$cmdLine\""
bash -c "$cmdLine" &
wait
于 2013-10-03T10:05:52.767 に答える
1

&マルチタスクを行っていることを意味しますが、

1 >/dev/null 2>/dev/null

出力を一種のガベージにリダイレクトすることを意味します。そのため、何も表示されません。

さらにcmdLine="$1 >/dev/null"、間違っています。'代わりに次を使用する必要があります"

cmdLine='$1 >/dev/null' 
于 2013-10-03T09:14:19.787 に答える