Je travaille sur un script pour automatiser la création d'un fichier .gitconfig
.Sous-script Bash redirige l'entrée vers/dev/null par erreur
Ceci est mon script principal qui appelle une fonction qui à son tour exécute un autre fichier.
dotfile.sh
COMMAND_NAME=$1
shift
[email protected]
set +a
fail() {
echo "";
printf "\r[${RED}FAIL${RESET}] $1\n";
echo "";
exit 1;
}
set -a
sub_setup() {
info "This may overwrite existing files in your computer. Are you sure? (y/n)";
read -p "" -n 1;
echo "";
if [[ $REPLY =~ ^[Yy]$ ]]; then
for ARG in $ARG_NAME; do
local SCRIPT="~/dotfiles/setup/${ARG}.sh";
[ -f "$SCRIPT" ] && echo "Applying '$ARG'" && . "$SCRIPT" || fail "Unable to find script '$ARG'";
done;
fi;
}
case $COMMAND_NAME in
"" | "-h" | "--help")
sub_help;
;;
*)
CMD=${COMMAND_NAME/*-/}
sub_${CMD} $ARG_NAME 2> /dev/null;
if [ $? = 127 ]; then
fail "'$CMD' is not a known command or has errors.";
fi;
;;
esac;
git.sh
git_config() {
if [ ! -f "~/dotfiles/git/gitconfig_template" ]; then
fail "No gitconfig_template file found in ~/dotfiles/git/";
elif [ -f "~/dotfiles/.gitconfig" ]; then
fail ".gitconfig already exists. Delete the file and retry.";
else
echo "Setting up .gitconfig";
GIT_CREDENTIAL="cache"
[ "$(uname -s)" == "Darwin" ] && GIT_CREDENTIAL="osxkeychain";
user " - What is your GitHub author name?";
read -e GIT_AUTHORNAME;
user " - What is your GitHub author email?";
read -e GIT_AUTHOREMAIL;
user " - What is your GitHub username?";
read -e GIT_USERNAME;
if sed -e "s/AUTHORNAME/$GIT_AUTHORNAME/g" \
-e "s/AUTHOREMAIL/$GIT_AUTHOREMAIL/g" \
-e "s/USERNAME/$GIT_USERNAME/g" \
-e "s/GIT_CREDENTIAL_HELPER/$GIT_CREDENTIAL/g" \
"~/dotfiles/git/gitconfig_template" > "~/dotfiles/.gitconfig"; then
success ".gitconfig has been setup";
else
fail ".gitconfig has not been setup";
fi;
fi;
}
git_config
Dans la console
$ ./dotfile.sh --setup git
[ ?? ] This may overwrite existing files in your computer. Are you sure? (y/n)
y
Applying 'git'
Setting up .gitconfig
[ .. ] - What is your GitHub author name?
Puis je ne peux pas voir ce que je tape ...
Au bas de dotfile.sh
, je redirige toute erreur qui se produit pendant mon appel de fonction à /dev/null
. Mais je devrais normalement voir ce que je tape. Si j'enlève 2> /dev/null
de cette ligne sub_${CMD} $ARG_NAME 2> /dev/null;
, ça marche !! Mais je ne comprends pas pourquoi.
J'ai besoin de cette ligne pour empêcher mon script de renvoyer une erreur si ma commande n'existe pas. Je ne veux que mon propre message.
par exemple.
$ ./dotfile --blahblah
./dotfiles: line 153: sub_blahblah: command not found
[FAIL] 'blahblah' is not a known command or has errors
Je ne comprends vraiment pas pourquoi l'entrée dans mon script secondaire est redirigé vers /dev/null
comme je l'ai mentionné que stderr pour être redirigé vers /dev/null
.
Merci
'ARG_NAME = $ @' est faux, faux, faux. 'pour arg dans" $ @ "; do'. – chepner
Extension du commentaire de chepner: si vous avez vraiment besoin de stocker les arguments, utilisez 'arg_names = (" $ @ ")' et 'pour arg dans" $ {arg_names [@]} "'. En outre, vous devriez vraiment avoir des lignes explicites de shebang pour faire fonctionner les scripts avec bash plutôt qu'avec un shell générique (c'est-à-dire démarrer chaque script avec '#!/Bin/bash'). –
En fait, j'ai le Shebang. J'ai simplement oublié de le coller ici. Merci pour les conseils. Est-ce juste une mauvaise pratique d'ajouter cette ligne inutile ou c'est faux pour une autre raison? – eakl