위험한 인클로저 상태에 대한 의견 [닫기]

위험한 인클로저 상태에 대한 의견 [닫기]

이것이 내가 달성하고 싶은 것입니다.

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

이는 이미 수행 중인 작업에 대한 매우 간단한 표기일 뿐입니다. 그렇지 않은 경우 [[ ... ]]테스트가 생성되므로 명령 목록의 실행은 .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

&&그러나 조건은 여전히 ​​목록의 일부일 뿐이므로 다음과 같은 점 에 유의하는 것이 여전히 중요합니다 .

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?"

관련 정보