한 스크립트의 플래그를 다른 스크립트의 함수로 전달하는 방법

한 스크립트의 플래그를 다른 스크립트의 함수로 전달하는 방법

나는 많은 프로그램(homebrew, git 등)이 설치되어 있는 스크립트를 가지고 있으며 그 과정에서 수행되는 모든 작업을 기록하도록 하고 있지만 플래그를 전달하여 로깅을 끄고 stdout싶습니다. --no-log. 로깅 기능은 여러 도우미 스크립트가 포함된 파일에서 시작되므로 이러한 다른 파일에 플래그를 전달할 수 없습니다.

[편집하다]

주어진(./bin/install.sh)

#!/usr/bin/env bash

# Test for known flags
for opt in $@
do
    case $opt in
        --no-log) export SILENT=true ;;
        -*|--*) 
            e_warning "Invalid option $opt" 
            run_help
            ;;
    esac
done

source ./lib/utils

e_process "Installing Homebrew"
ruby -e "$(curl -#fkL raw.github.com/Homebrew/homebrew/go/install)"

그리고(./lib/utils.sh)

#!/usr/bin/env bash

logging() {
    # write your test however you want; this just tests if SILENT is non-empty
    if [ -n "$SILENT" ]; then
        "$@" &> /dev/null
    else
        "$@"
    fi
}

# Command/Processing logging
e_process() {
    logging printf "$(tput setaf 6)┃ $(tput sgr0)$(tput setaf 7)%s...$(tput sgr0)\n" "$@"
}

그 다음에

실행하면 ./bin/dotfiles로깅이 표시될 것으로 예상되지만 ┃ Installing Homebrew...실행하면 ./bin/dotfiles --no-log로깅이 표시되지 않을 것으로 예상되지만 작동하지 않습니다.

산출(사용 bash -x)

$ bash -x ./bin/install.sh
+ source ./lib/utils.sh
+ e_process 'Installing Homebrew'
++ tput setaf 6
++ tput sgr0
++ tput setaf 7
++ tput sgr0
+ logging printf '┃ %s...\n' 'Installing Homebrew'
+ '[' -n '' ']'
+ printf '┃ %s...\n' 'Installing Homebrew'
┃ Installing Homebrew...

사용--no-log

bash -x ./bin/install.sh --no-log
+ for opt in '$@'
+ case $opt in
+ export SILENT=true
+ SILENT=true
+ source ./lib/utils.sh
+ e_process 'Installing Homebrew'
++ tput setaf 6
++ tput sgr0
++ tput setaf 7
++ tput sgr0
+ logging printf '┃ %s...\n' 'Installing Homebrew'
+ '[' -n true ']'
+ printf '┃ %s...\n' 'Installing Homebrew'

답변1

utils 스크립트를 얻습니다.앞으로환경 변수의 값을 설정하므로 전역 변수는 $silent_mode비어 있습니다.

유틸리티 스크립트에서 "temp" 변수를 사용하지 말고, $SILENT이 함수에서 계속 사용하십시오.

관련 정보