위험한 쉘에 대한 조건부 주석

위험한 쉘에 대한 조건부 주석

내가 달성하려는 것은 다음과 같습니다.

#!/bin/bash
safemode=on

if [ $safemode == 'off' ];then
  run dangerous code
fi

나는 모두 분리된 129개의 위험한 선을 가지고 있습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

"최선의 방법"은 얼마나 많은 노력을 최대로 고려하는지에 따라 크게 달라집니다. 다소 쉬운 방법 중 하나 &&는 예제를 약간 수정하기 위해 -connected 명령 목록을 사용하는 것입니다 . Bash의 산술 테스트 구성을 사용할 수 있습니다.

#!/bin/bash
safemode=1

(( ! safemode )) && run dangerous code 1
uncritical code
(( ! safemode )) && run dangerous code 2

또는 일반 문자열 기반 연산자

#!/bin/bash
safemode=on

[[ $safemode = "off" ]] && run dangerous code 1
uncritical code
[[ $safemode = "off" ]] && run dangerous code 2

이것은 이미 수행한 작업에 대한 간단한 표기일 뿐입니다. 테스트는 is 가 아닌 경우 [[ ... ]]결과를 산출하므로 명령 목록의 실행은 에서 중지됩니다 .falsesafemodeoff&&

체인으로 연결된 명령 목록 의 경우 &&종료 코드는 마지막으로 실행된 명령의 종료 코드가 됩니다. 따라서 safemode설정된 경우 해당 "보호된" 줄 뒤에 $?있게 됩니다 1(종료 코드를 사용하는 경우에만 해당). 그런 식으로).

답변2

safemode변수를 두 명령 중 하나 true또는 로 정의하면 false이를 접두사로 사용할 수 있습니다.

#!/bin/sh
safemode=true

safe_mode_off() { safemode=false }

"$safemode" || run dangerous code 1
uncritical code
"$safemode" || run dangerous code 2

나는 일반적으로 옵션 처리에서 변수를 설정한다고 생각하므로 true/ 는 / false만큼 쉽습니다 .onoff


우리~할 수 있었다아마도 이것을 확장하여(반드시 그래야 한다고 생각하지는 않지만) false다음과 같이 위험한 명령이 에 대한 인수가 되도록 만들 수 있습니다.

#!/bin/sh
risky=false

safe_mode_off() { risky= }

$risky run dangerous code 1
uncritical code
$risky run dangerous code 2

그러나 이 경우 확장은 여전히 ​​인수 내에서 발생합니다. 예를 들어 $(dangerous subcommand)계속 실행되므로 이를 로 변경해야 합니다 $($risky dangerous subcommand). 나는 그것이 진지하게 사용하기에는 너무 오류가 발생하기 쉽다고 생각합니다.

답변3

속기를 원하면 별칭을 사용할 수 있습니다. 일반 확장보다 텍스트 교체와 비슷하므로 구문 구성이~할 수 있다그들을 통해 삽입됩니다. Bash 스크립트에서 명시적으로 활성화해야 하며, 원치 않는 별칭도 실수로 활성화하지 않도록 해야 합니다.

#!/bin/bash
unalias -a
shopt -s expand_aliases

# default safe
alias risky='[ "$riskymode" = enabled ] &&'
riskymode=
if [ "$1" = risky ]; then
        riskymode=enabled
fi

echo this is normal
risky echo this is risky

그러나 조건은 여전히 ​​-list의 일부일 뿐이므로 다음과 같은 주의 사항이 있습니다 &&.

risky echo try something risky || echo oopsie it failed

echo oopsie위험 모드가 비활성화된 경우에도 실행됩니다 .

하지만 당신은 할 수 있습니다:

risky ( echo try something risky || echo oopsie it failed )

또는

risky if ! echo another risky attempt; then echo another failure; fi

(-list 안에 복합 명령을 넣을 수 있습니다 &&)


별칭을 사용하여 해당 줄을 주석으로 만들 수도 있습니다.

#!/bin/bash
unalias -a
shopt -s expand_aliases
alias risky='#'
if [ "$1" = risky ]; then
        alias risky=''
fi
risky echo something risky, again || echo "does it fail now?"

하지만 물론 첫 번째는 무시할 것입니다., 따라서 "안전" 모드에서 두 번째 줄을 다시 실행합니다.

risky echo something even more risky ||
    echo "_now_ does it fail?"

관련 정보