2014-04-26 3 views
4

전달 방법에 관계없이 함수 내에서 $?을 테스트하는 데 문제가 있습니다. 그들은 0이 아닌 기능은 훨씬 더 자세한 이것보다이며 함수에 있어야이 함수에서이 당겨 제안하지 마십시오 경우

__myretval() { 
    if [ $1 -ne 0 ]; then 
    printf -- "%s" "$1" 
    fi 
} 
PS1="$(__myretval '$?') $" 

retvals을 가지고있는 목표는 보여줍니다.

$ false 
1 $ true 
$ 

나는 내가 생각할 수있는 모든 조합을 시도했다, 그러나 아무것도 포함하지만 다음의 조합에 국한되지 작동 것 같다. 나는 따옴표 안에 값을 넣으려고했지만 따옴표는 사용하지 않았다. 나는 따옴표없이 0으로 동일한 작업을 시도했다.

if [ $1 -ne 0 ]; then 
if [ $1 != 0 ]; then 
if [ $? -ne 0 ]; then 
if [ $? != 0 ]; then 
PS1="$(__myretval "$?") $" 
PS1="$(__myretval "\$?") $" 

어느 값 항상 인쇄하거나 결코 인쇄합니다.

답변

4

이 나를 위해 작동합니다

__myretval() { 
    if (($1)); then 
    printf -- "%s" "$1" 
    fi 
} 
PS1='$(__myretval "$?") $' 

당신의 문제가 따옴표와 함께했다 보인다.


때 당신에게 상태 :

PS1="$(__myretval '$?') $" 

당신이하고있는 것은 (때문에 따옴표)입니다 : $?이 확장 인수 '$?'와 기능 __myretval의 출력에 PS1 설정 지금. 따라서 PS1은 변경되지 않습니다. 그래서이 캐릭터 라인이 확장된다 (평가)

$(__myretval "$?") $ 

각각의 새로운 프롬프트에서 : 대신 원하는 것은

PS1이 문자열을 포함하는 것입니다. 그렇기 때문에 작은 따옴표을 사용하여 PS1을 정의해야합니다.

+0

@jnovack이 경우에는 동일합니다. bash에서는 산술 계산에 이중 괄호를 사용하는 것이 좋습니다. '((var))'는'var'가 nil 값으로 확장되지 않는 경우에만 true입니다 :'((var! = 0))'에 대한 설탕입니다. 귀하의 질문은 Bash라고 태그를 달았습니다. 나는 당신이 가장 좋은 Bash 스타일의 코드를 원한다고 생각했습니다. –

+0

이것은 놀랍지 만 bash 변수를 사용하기 위해 확장되지 않습니다. 예, 작동합니다. 그러나 함수가 더 복잡하므로 PS 변수가 확장되지 않습니다. 표준 [\ u @ \ h]에 추가하면 작동하지 않습니다. 다른 변수 (예 : 이스케이프 된 색상)를 추가 할 때 작동하지 않습니다. :/ – jnovack

+0

@jnovack 당신은 정말로 무엇을 의미합니까? 이 템플릿을 사용할 수없는 기능은 무엇입니까? –

3

'" 두 개의 따옴표를 사용하여 포함 된 표현식과 변수를 평가할 때 제어 할 때 제어해야합니다.

또한 $?을 매개 변수로 전달하는 이유는 무엇입니까? 기능의 문으로 local status=$? 추가하면 어떤 검사가 필요하지 않습니다 $status 지금 놀라움과 유효한 문자열을 포함 보장되기 때문에, 우리는 printf 필요하지 않습니다, 또한

__myretval() { 
    local status=$? 
    [[ $status -eq 0 ]] && return 

    echo $status 
} 

을 , $(...)은 최종 줄 바꿈을 삭제합니다. 당신이 PS1 적절한 인용이 필요합니다 설정 방법

: PS1가 설정됩니다 때

PS1="${OTHER_VARIABLE}"'$(__myretval) $ ' 

따옴표 평가는, 작은 따옴표는 연기.

+1

이것은 실제로 다음 질문에 응답합니다. PS1에서 PS BASH 변수를 어떻게 사용합니까? 불행히도 나는 대답을 모두 받아들이지 못한다. 그러나 이것을 읽는 사람들은이 답변을 잘 활용하고 싶어합니다. – jnovack

+1

더 큰 그림을보기 위해 +1. 외부에서'$? '를 전달할 필요가 없습니다. – mklement0

관련 문제