2016-08-10 6 views
3

こんにちは人のコマンドを見つける:は、ファイル名を指定して実行bashのファイルから

#!/bin/bash 

OUTPUT_DIR=`zenity --file-selection --directory --filename="$1"` 

if [ $? == 0 ]; then 
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \; 
fi 

:私は、たとえば、出力ディレクトリを取得し、いくつかの操作を実行するために、ソースファイル、使用zenityを使うように指定したディレクトリを取るためにXFEスクリプトを作ってるんですスクリプトが呼び出されると、oggencは実行されません。

ソリューション:、回答に怒鳴る基づいて予想通り、この作品:

#!/usr/bin/sh 

OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1") 

if [ $? = 0 ]; then 
    export OUTPUT_DIR 
    find "$1" -maxdepth 1 -type f -name "*.wav" -exec sh -c 'oggenc -Q "$0" -q 3 -o "${OUTPUT_DIR}/$(basename "${0/.wav/.ogg}")"' {} \; 
fi 
zenity --info --text="Done" 

答えて

1

1行を追加し、子プロセスへの変数$OUTPUT_DIRが利用できるようにするには:

OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1") 
if [ $? = 0 ]; then 
    export OUTPUT_DIR 
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \; 
fi 

あるいは、わずか簡単:

if OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1"); then 
    export OUTPUT_DIR 
    find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \; 
fi 

s:

  1. コマンド'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"'は一重引用符で表示されます。これは、変数が親シェルによって展開されていないことを意味します。それらは子シェルによって拡張されます。子シェルで使用できるようにするには、変数をエクスポートする必要があります。

  2. [ $? == 0 ]はbashで動作しますが、[ $? = 0 ]でも動作し、より移植性があります。

  3. コマンド置換はバッククォートで行うことができ、一部の古いシェルではバッククォートのみを受け入れることができます。しかし、現代のシェルの場合、$(...)には読みやすさの向上という利点があります(一部のフォントでは、後ろの引用符と通常の引用符が明確に区別されません)。また、$(...)は、明確かつ賢明な方法で入れ子にすることができます。

+0

ありがとうございました。 – Joel

1

私はwhileループオーバーパイプライニングを使用することをお勧めします。あなたのコードは、このように

while IFS= read -r -d '' file; do 
    oggenc -Q "${file}" -q 3 "${OUTPUT_DIR}/$(basename ${file/.wav/.ogg})" 
done < <(find . -maxdepth 1 -type f -name "*.wav" -print0) 

を書き換えることができる。あなたのコードが動作しなかった理由は、単一引用符'は、変数の拡張ので$OUTPUT_DIRが拡大しないだろう禁じるということです。

EDIT

-print0IFS=と組み合わせて使用​​されるだけ\0ではなく、ファイル名に空白にfind出力を分割することです。

+0

あなたのコードでは、使用する前に 'OUTPUT_DIR'をエクスポートする必要がありますか? – Joel

+0

@Joel nope。通常は二重引用符で拡大します – vsminkov

+0

@ John1024指摘してくれてありがとう。私は間違ったIFSでテストしました。私はそれを修正する – vsminkov

関連する問題