2017-01-18 3 views
0

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

+1

'ARG_NAME = $ @' est faux, faux, faux. 'pour arg dans" $ @ "; do'. – chepner

+0

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'). –

+0

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

Répondre

0

Avez-vous besoin de l'option -e dans vos read déclarations? J'ai fait un test rapide dans un shell interactif. La commande suivante ne fait pas écho caractères:

read -e TEST 2>/dev/null 

Ce qui suit ne fait pas écho aux caractères

read TEST 2>/dev/null