2012-01-26 2 views
0

OS X에서 bash를 사용 중이며 Applications 디렉토리의 모든 응용 프로그램에 포함 된 키의 데이터를 읽으 려합니다. 결과는 반환 된 각 응용 프로그램 대신 전체 목록에 자체 적용을 시도하는 '기본값'명령 인 것 같습니다.목록에 Bash loop 명령이 있습니다.

#!/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 

도움을 주시면 감사하겠습니다.

답변

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

"$(ls /Applications)"과 같이 따옴표를 붙이면 쉘이 인용 된 것을 공백에서 여러 인수로 분리하지 않고 단일 인수로 취급합니다. 따라서 for 루프는 각 응용 프로그램에 대해 한 번만 실행되는 것이 아니라 전체 응용 프로그램 목록에 APPS이 설정된 한 번만 수행됩니다. 따옴표를 제거하면 응용 프로그램의 이름에 공백이없는 한 따옴표가 각 응용 프로그램에 대해 한 번 실행됩니다. 불행히도 이름에 공백이 있으면 공백에서 이름이 깨져서 제대로 작동하지 않습니다.

파일 이름에 공백이있는 파일을 안전하게 처리하는 것은 쉘에서 통증이되므로 파일 이름에 공백을 사용하지 않는 것이 좋습니다. 불행히도 Microsoft와 Apple은 이러한 조언을 따르지 않습니다.

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

(서면으로) 스크립트의 또 다른 문제는 그 이전의 결과를 덮어 쓰기, 각 반복의 결과로 저장하는 것입니다 :이 경우에 할 수있는 것은 같은 것입니다. 따라서 인쇄중인 마지막 부분의 $result의 내용은 마지막 반복의 결과 일뿐입니다.

+0

@Chris는 내가 잘못 가고 있다는 것을 나에게 분명히 말했기 때문에 귀하의 의견을 보내 주셔서 감사합니다. 나는 공백의 사용에 동의하고 우리 사무실 사용자에게 파일 이름에 공백을 사용하지 말라고 말한다. – chop

1

나는 오류가 발생하기 쉽기 때문에 ls 루핑 명령을 사용하지 않는 것이 좋습니다. 당신이 변수에 디폴트 명령의 출력을 저장할 필요가없는 결과를 울리는에 관심이

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

모든 때문에 한 다음 에코 : 재귀 적으로 응용 프로그램을 찾으려면이처럼 루프를 실행합니다.

+0

고마워요 @anubhava,이 작동하지만 하위 디렉토리를 통해 이동해야했고 키가 존재하지 않는 곳을 찾아야했습니다. 나는'ls'가 오류가 발생하기 쉬운 이유를 알기를 바랍니다. 고마워요. – chop

+1

ls 출력을 파싱하는 것에 대해 읽으십시오. http://mywiki.wooledge.org/ParsingLs 루핑에서'ls'의 사용에 관해 논의 할뿐만 아니라, 많은 Q & A를 찾을 수 있습니다. 재귀 적 응용 프로그램을 원하면 pls가 내 업데이트 된 응답을 확인하십시오. – anubhava

+0

고마워요. @anubhava 내가 읽었고'ls'을 사용하지 않는 법을 배웠습니다. 당신의 대답으로 작동하도록 코드를 수정했습니다. – chop

관련 문제