私は端末で普遍的に使用するために bash スクリプトを直接書こうとしています。アプリケーションをバックグラウンドプロセスとして起動し、対応するstderr出力を削除する必要があります。これが私が得るものです:
for app in $@; do
$app 2>/dev/null
done
引数なしで基本アプリケーションを実行しているように見えますが、script.sh firefox gedit
次のことはできません。
script.sh "vlc video.mp4"
私の質問は:パラメータ/ファイルを入力として使用するアプリケーションを処理するためにこの基本スクリプトをどのように拡張できますか?たぶん私が利用できるツールがすでにあるかもしれません。
答え1
2つの質問があります。
$@
引用符なしで使用してください。これにより、スクリプト呼び出しで同じ引用符付き文字列内にあっても、ループは2つの別々の項目で繰り返されます
vlc
。video.mp4
変数にコマンドを使用します。
コマンドが単一の単純なコマンドよりも複雑な場合は機能しません。
eval
指定した文字列に変更する必要があります。
これを念頭に置いて、スクリプトは次のようになります。
#!/bin/sh
for cmd do # or: for cmd in "$@"; do
eval "$cmd" 2>/dev/null
done
呼ぶ
./script 'echo "hello world"' 'vim "$HOME/.profile"' 'tr a-z A-Z <"$HOME/.profile" | grep -c EXPORT'
最初に実行して完了すると、2番目のコマンドで指定されたファイルを編集するためにecho "hello world"
開きます。vim
最後のコマンドはより複雑ですが、私たちがそれを使用しているという事実によって処理されます(単にすべてのアルファベット文字を大文字に変更し、文字列がファイルに表示される回数を数えますeval
)。セッションが終了EXPORT
すると実行されます。vim
これであなたもできます
./script 'd=$HOME' 'ls "$d"'
つまり、後続のコマンドで使用される変数を設定します。これは、呼び出されたコマンドがeval
スクリプトと同じ環境で実行されるために機能します。質問のタイトルからわかるように、コマンドをバックグラウンドジョブとして起動すると機能しません。
答え2
現在、スクリプトは各引数を別々のアプリケーションとして処理するように指示しています。だからあなたは実行しています:
$ vlc
それから:
$ video.mp4
スクリプトを次のように作成する必要があります。
#!/bin/bash
$@ 2>/dev/null
私の考えでは、どちらが関数として優れていますか?
func_name() {
$@ 2>/dev/null
}
注:これにより、一度に1つのコマンドしか実行できません。もともと意図が一度に複数のコマンドをスクリプトに渡したいかどうかはわかりません。その場合は削除します。