bash機能から正しい方法に戻る方法は?

bash機能から正しい方法に戻る方法は?

端末からインポートされたこのスクリプトは、_cphetznergitリポジトリを作成する機能を提供します。この関数は、_feed_variableユーザーに欠落している変数を尋ねる別の関数を使用します。

この時点で私の質問は次のとおりです。

  1. これが関数から復帰する正しい方法ですかreturn 1
  2. コメントを削除すると、set -o errexitスクリプトは何でもreturn 1(例:関数_feed_variableやシェルに返される関数から)中断されますか?
  3. コメントを外した場合、set -o errexit端末を閉じずに機能を終了する正しい方法は何ですか?
  4. エラーを解決する方法でスクリプトを設計していないようです。どんな提案がありますか?

#!/usr/bin/env bash

# +---------------+
# | Bash settings |
# +---------------+
# abort on nonzero exitstatus
# set -o errexit
# abort on unbound variable
# set -o nounset
# don't hide errors within pipes
# set -o pipefail

# +----------------+
# | Bash Variables |
# +----------------+

# +----------------+
# | Script Content |
# +----------------+

function _feed_variable() {

  local prompt_msg=$1
  local var_to_set=$2

  echo "$prompt_msg"

  read answer

  case $answer in
    [Yy]*) 
      echo "Enter $2: "
      read new_value
      eval $var_to_set="'$new_value'"
      return 0
      ;;
    [Nn]*)
      echo "Clearing up and quitting ..."
      return 1
      ;; 
  esac
}

function _cphetzner() {
    pushd $PWD > /dev/null
    POSITIONAL_ARGS=()

    REPO_NAME=
    # TARGET_FOLDER=$PWD/$REPO_NAME
    TARGET_FOLDER=
    SOURCE_TEMPLATE=    
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            -r|--repository)
                REPO_NAME="$2"
                shift
                shift 
                ;;
            -s|--sourcetemplate)
                SOURCE_TEMPLATE="$2"
                shift
                shift 
                ;;
            -t|--targetfolder)
                TARGET_FOLDER="$2"
                shift
                shift
                ;;
            -*|--*)
                echo "Unknown option $1"
                exit 1
                ;;
            *)
                POSITIONAL_ARGS+=("$1") # save positional arg
                    shift # past argument
                    ;;
        esac
    done

  #=====[ Print Info ]==================================

  echo "SOURCE_TEMPLATE is:\t" $SOURCE_TEMPLATE
  echo "TARGET_FOLDER is:\t" $TARGET_FOLDER
  echo "{POSITIONAL_ARGS is [@]}:\t" ${POSITIONAL_ARGS[@]}
  echo "REPO_NAME is:\t" $REPO_NAME

  set -- "${POSITIONAL_ARGS[@]}"

  if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
      tail -1 "$1"
  fi

  #=====[ Create folder and initiate repository ]=======

  # Check if user input has repo name
  if [[ -z "$REPO_NAME" ]]; then
    _feed_variable "Do you want to feed me a repository name? [y/n]" "REPO_NAME" ||
    return 1
  fi

  # Check if repository in given path exists
  if [[ -z "$TARGET_FOLDER" ]]; then
    _feed_variable "Do you want to feed me a target name? [y/n]" "TARGET_FOLDER" ||
    return 1
  fi

  while [[ -d "${TARGET_FOLDER}/${REPO_NAME}" ]]
  do
    echo "Repository already exist in this folder" && 
    _feed_variable "Do you want to feed me another target name? [y/n]" "TARGET_FOLDER" ||
    return 1
  done

  # Create folder 
  mkdir -p $TARGET_FOLDER/$REPO_NAME 

  # # Check if template folder exists
  #   [[ -z $SOURCE_TEMPLATE ]] && echo "No template folder" ||  
  #       cp -a $SOURCE_TEMPLATE/ $TARGET_FOLDER/$REPO_NAME


  #====[ Initiate Repo ]================================
  
  cd $TARGET_FOLDER/$REPO_NAME
    git init
    git remote add origin hetzner:/yolo/$REPO_NAME.git

    git add .
    git commit -m "Initial commit" 

  echo -e "[DONE] Repo $REPO_NAME created successfully"
  echo -ne "Do you want to push repo to Hetzner now? [y/n]"
    
  read answer

    case $answer in
    [Yy]*) 
          echo "Pushing to Hetzner ..."
      git push -u -f origin master
      ;;
    [Nn]*) 
      ;;
    esac

    echo "Have a great day ..." 

  return 0

    popd > /dev/null
}


ベストアンサー1

シェルは終了状態を次のように見なします。若い真/成功、そして0以外状態は偽/失敗です。したがって、その機能が成功すれば、return 0より正確であると見なすことができますreturn 1

set -e/ の場合set -o errexit、どのコマンド/関数でも実行されません。たとえば、条件として使用される部分や終了状態が無視される部分(パイプの一番右以外の部分)を無視します。ただし、エラーが発生するネストレベルは重要ではありません。しかし、使用するのが難しいいくつかの複雑さがあります。

fail() { return 1; }
# these won't trigger set -e
fail | cat
fail || true
if fail; then echo x; fi
# so this prints
echo one

# these also won't trigger it
try() {
    fail
    echo two
}

try || true
( fail; echo three ) || true

バラよりhttps://mywiki.wooledge.org/BashFAQ/105奇妙なことについてset -e

おすすめ記事