빈 출력과 성공적인 종료 상태를 모두 확인하세요.

빈 출력과 성공적인 종료 상태를 모두 확인하세요.

설치 프로그램 스크립트 1 에 다음 테스트를 작성하고 싶습니다 .

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    install_dual_boot
else
    install_linux_only
fi

30_os-prober그러나 어떤 방식으로든 완료하지 못했기 때문에 출력이 생성되지 않을 수도 있습니다 . 0이 아닌 종료 상태로 실패하는 경우 30_os-prober이중 부팅 상황을 가정하는 것이 더 안전합니다.

30_os-prober출력이 생성되지 않았 는지 어떻게 확인할 수 있나요?성공적으로?

기본적으로 다음과 같은 효과를 얻고 싶습니다.

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    # Do stuff for a dual-boot machine
    install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
    # OS probe failed; assume dual boot out of abundance of caution
    install_dual_boot
else
    install_linux_only
fi

...하지만 동일한 명령을 두 번 실행할 필요는 없습니다.


1배경 정보: 30_os-proberInc.GRUB2, 제가 ​​작성 중인 스크립트는 내 맞춤 구성의 일부입니다.고정 자산 투자.

답변1

첫째, 기능적으로는 동일하지만 다음 $(…)보다 작은 것으로 널리 간주됩니다 .`…`이것,이것, 그리고이것. 둘째, $?명령이 성공했는지 실패했는지 확인할 필요가 없습니다 . 최근 내 관심이 집중된 곳은섹션 2.9.1,간단한 명령 ~의그룹 셸 및 유틸리티 기본 코드 열기(문제 7):

"간단한 명령"은 임의의 순서로 선택적인 변수 할당 및 리디렉션의 시퀀스이며 선택적으로 단어와 리디렉션이 뒤따르고 제어 연산자에 의해 종료됩니다.

주어진 간단한 명령을 실행해야 할 때...
                          ⋮                                                                                (ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ...)

명령 이름이 있으면 다음에 설명된 대로 실행을 계속해야 합니다.명령어 검색 및 실행. 명령 이름은 없지만 명령에 명령 대체가 포함된 경우 명령은 마지막으로 실행된 명령 대체의 종료 상태로 완료되어야 합니다. …

예를 들어,

  • 명령의 종료 상태

    ls -ld "module_$(uname).c"
    

    종료 상태 ls이지만

  • 명령의 종료 상태

    myfile="module_$(uname).c"
    

    종료 상태입니다 uname.

그래서페라다의 답변이는 약간 단순화될 수 있습니다.

if 출력=$(/etc/grub.d/30_os-prober) && [ -z "$output" ]
    # 즉, 만약에30_os-검출기 성공적으로출력을 생성하지 않습니다
그 다음에
    리눅스만 설치하세요
기타
    듀얼 부팅 설치
필리핀 제도

환경 변수(또는 스크립트 전체에 표시되는 변수)에만 이름을 모두 대문자로 사용하는 것이 가장 좋습니다. 제한된 범위의 변수는 일반적으로 소문자(또는 원하는 경우 camelCase)로 이름이 지정됩니다.

답변2

변수에 값을 할당한 다음 종료 상태도 확인할 수 있습니다.

PROBE_VALUE=`/etc/grub.d/30_os-prober`

if [ "$?" -eq 0 ] && [ -z "$PROBE_VALUE" ]; then
    install_linux_only
else
    install_dual_boot
fi

관련 정보