端末からインポートされたこのスクリプトは、_cphetzner
gitリポジトリを作成する機能を提供します。この関数は、_feed_variable
ユーザーに欠落している変数を尋ねる別の関数を使用します。
この時点で私の質問は次のとおりです。
- これが関数から復帰する正しい方法ですか
return 1
? - コメントを削除すると、
set -o errexit
スクリプトは何でもreturn 1
(例:関数_feed_variable
やシェルに返される関数から)中断されますか? - コメントを外した場合、
set -o errexit
端末を閉じずに機能を終了する正しい方法は何ですか? - エラーを解決する方法でスクリプトを設計していないようです。どんな提案がありますか?
#!/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
。