2013-05-09 1 views
3

좋은 하루. 필자는 함수를 통해 실행하고 싶었던 일련의 명령을 사용하여 종료 코드를 얻고 그에 따라 콘솔 출력을 수행 할 수있었습니다. 그 말로는 여기에 두 가지 이슈가 있습니다 :Bash 명령 대체 stdout + stderr redirect

1) stderr을/dev/null로 지정할 수 없습니다.

2) 첫 번째 에코 라인은 $ 1이 실행될 때까지 표시되지 않습니다. 하드 드라이브에서 파일을 검색하는 것과 같이 처리하는 데 시간이 걸리는 명령을 실행하기 전에는 눈에 띄지 않습니다. 출력의 모양 때문에 또한,이,이 경우는 분명있다 : 즉

sh-3.2# ./runScript.sh 
sh-3.2# com.apple.auditd: Already loaded 
sh-3.2# Attempting... Enable Security Auditing ...Success 

의 표준 오류가 전에 표시했다 "시도 ... $ 2"여기

이 기능은 내가 노력하고 있어요 사용 :

#!/bin/bash 
function saveChange { 
    echo -ne "Attempting... $2" 
    exec $1 
    if [ "$?" -ne 0 ]; then 
     echo -ne " ...Failure\n\r" 
    else 
     echo -ne " ...Success\n\r" 
    fi 
} 

saveChange "$(launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist)" "Enable Security Auditing" 

어떤 도움이나 조언을 부탁드립니다.

답변

2

이는 /dev/null

command 2> /dev/null 

예에 열려진 리디렉션하는 방법입니다

ls -l 2> /dev/null 

귀하의 두 번째 부분 (echo의 즉 순서) -이 때문에 스크립트를 호출하는 동안 당신이이 일 수있다. $(launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist)

+0

안녕 빌, 덕분에 큰 일을했습니다. 실행될 명령 대신에 함수 내에서/dev/null로 리디렉션하려고했습니다. 두 번째 질문에 대한 조언이나 의견이 있습니까? – Taelo

+0

이것을 할 수 있습니다 -'exec $ 1 2/dev/null' – Bill

+0

첫 번째 인수에서 왜'$'합니까? 어떤 이유? 전체 문자열을 스크립트에 전달하려는 경우'launch ....... '를 수행하고'$ 1'이 모든 것을 집어 야합니다. – Bill

1

첫 번째 에코 라인은 두 번째로 실행 중이므로 나중에 표시됩니다. $ (...)가 코드를 실행합니다. 다음보십시오 :

#!/bin/bash 
function saveChange { 
    echo -ne "Attempting... $2" 
    err=$($1 2>&1) 
    if [ -z "$err" ]; then 
     echo -ne " ...Success\n\r" 
    else 
     echo -ne " ...Failured\n\r" 
     exit 1 
    fi 
} 

saveChange "launchctl load -w /System/Library/LaunchDaemons/com.apple.auditd.plist" "Enable Security Auditing" 

편집 :launchctl 실제로 $ 설정하지 않는 것으로 나타났습니다? 오류가 발생하면 대신 STDERR을 캡처하여 오류를 감지하십시오.

+0

안녕하세요, Marcoseu,이 작동하지 않는 것 같습니다. bash -x는 명령을 올바르게 표시하지만 실행되지 않습니다. – Taelo

+0

이 스크립트를 실행하려면 샘플 코드에서 exec를 제거하십시오. 방금 launchctl이 실제로 $를 설정하지 않는다는 것을 알았습니다. 그 문제를 해결할 또 다른 답변을 게시 할 것입니다. – marcoseu

+0

고마워요; 그러나 $ 1이 실행을 완료 할 때까지는 여전히 첫 번째 에코 출력을 얻지 못합니다. 그 행동을 멈출 수있는 방법이 있습니까? 문자열을 전달하여 실행하는 데 시간이 걸리는 경우 빈 줄이 생깁니다. 명령이 끝나면 동시에 두 echo 문을 모두 가져옵니다. – Taelo