2012-01-26 6 views
0

私はOS X上でbashを使用しており、アプリケーションディレクトリ内のすべてのアプリケーションに埋め込まれたキーのデータを読み取ろうとしています。結果は返された各アプリケーションの代わりにリスト全体にそれ自身を適用しようとする 'defaults'コマンドのようです。リスト上のBashループコマンド

#!/bin/bash 

# appList=$(ls /Applications) 

for APPS in "$(ls /Applications)" ; do 
     result=$(defaults read /Applications/"$APPS"/Contents/Info DTPlatformBuild) 
done 

echo result is $result 

exit 0 

助けてください。 "$(ls /Applications)"のようなものの周りに引用符を置く

答えて

0

私は以下に行くつもりです。テキストファイル "appleApps.txt"は、新しいビルド上の既定のAppleアプリケーションの一覧であり、検索を控えるようになっています。 有効な企業アプリケーションは、ブールセットで「Info.plistファイル」ファイルに挿入された新しいキーを持つことになります。
これで、ユーザーがすでに自分自身をパッケージ化しているアプリケーションの独自のコピーをインストールしているかどうかを報告する仕組みができました。ヒントについて

#!/bin/bash 
echo " " 
echo " " 
rm -f /tmp/validApps /tmp/notValid 
find /Applications -name "*.app" | grep -v -F -f /Library/Application\ Support/CompanyData/appleApps.txt | while read APP 
do 
appVersion=`defaults read "$APP/Contents/Info" Company 2>/dev/null` 
if test "$appVersion" = 1 ; then 
    echo "$APP : $appVersion" >> /tmp/validApps 
else 
    echo "$APP" >> /tmp/notValid 
fi 
done 

echo " " 
echo " " 

result=$(cat -n /tmp/validApps) 
notValidResult=$(cat -n /tmp/notValid) 

printf "%s\n" "Our packaged Applications are:" "$result" 
echo " " 
echo " " 
printf "%s\n" "User installed Applications are:" "$notValidResult" 
echo " " 

rm -f /tmp/validApps /tmp/notValid 

exit 0 

おかげ限り$result

と私のエラーなど、私たちlsに理由はない上に読み、両方@クリスと@anubhava

の指示に従って、それを行うにはない学んできました
1

は、複数の引数にスペースでそれを壊すのではなく、単一の引数として引用されたものを治療するためのシェルの原因となります。したがって、forループは1回だけ実行され、アプリケーションごとに1回実行するのではなく、アプリケーションのリスト全体にAPPSが設定されます。引用符を削除すると、名前にスペースが含まれていない限り、アプリケーションごとに一度実行されます。残念なことに、名前にスペースがあると、スペースで名前が壊れて正しく動作しません。

彼らにスペースを含むファイル名で安全に扱うことは、あなたがファイル名にスペースを使用しないことをお勧めしている理由であるシェルの痛み、です。残念ながらMicrosoftとAppleはそのアドバイスに従いません。

ls /Applications | while read APPS; do 
    result=...whatever 
done 

(書かれて)あなたのスクリプトでもう一つの問題は、それが前の結果を上書きし、各反復で、結果に格納することです:あなたはこのような場合に行うことができます一つのことのようなものです。したがって、印刷中の最後の$resultの内容は、最後の反復の結果になります。

+0

あなたのコメントをお寄せいただきありがとうございます。私はスペースの使用について同意し、オフィスユーザーにファイル名でそれらを使用しないよう指示します。 – chop

1

私は決してそのエラーが発生しやすいので、ループのためlsコマンドを使用することをお勧めしないでしょう。再帰的にアプリケーションを見つけるために、このようなあなたのループを実行します。

find /Applications -name "*.app" -print0 | while IFS= read -r -d '' APP 
do 
    defaults read "$APP/Contents/Info" DTPlatformBuild 
done 

すべてあなたが変数にdefaultsコマンドの出力を保存し、それをエコーする必要はありません、結果をエコーに関心を持っているので。

+0

ありがとう@anubhava、これは動作しますが、私はサブディレクトリを通過する必要があり、キーが存在しなかった場所を提供する必要がありました。なぜ私は 'ls'がエラーになりやすいのかを知りたいのですが、どうもありがとうございます。 – chop

+1

lsの出力を解析することについては、これをお読みください:http://mywiki.wooledge.org/ParsingLs SOに関する多くのQ&Aと、ループ中の 'ls'の使い方について議論しています。あなたが再帰的なアプリケーションを望むなら、plsは私の更新された答えをチェックします。 – anubhava

+0

ありがとう@anubhava私は読んで、 'ls'を使わないことを学んだので、あなたの答えで動作するようにコードを修正しました。 – chop

関連する問題