web-dev-qa-db-fra.com

Impossible de se connecter après avoir ajouté un script à /etc/profile.d

J'ai créé un petit script pour ajouter des signets dans Nautilus pour rediriger les utilisateurs vers le partage réseau. Si j'exécute le script manuellement, il fonctionne parfaitement mais dès que j'essaye de l'ajouter dans /etc/profile.d, je ne peux pas me connecter à l'ordinateur. Il semble que dès que je fais une boucle ou quelque chose de "fantaisiste" comme ça, le script donne une erreur. Voici un exemple si mon script fonctionne actuellement:

#!/bin/bash

# Creating gtk-bookmarks if it doesn't exists
if [[ ! -f ~/.gtk-bookmarks ]]
then
        touch ~/.gtk-bookmarks
fi

# Adding bookmarks if not present
if ! grep -Fxq "smb://example.com/R03C01 Software:" ~/.gtk-bookmarks
then
    echo "smb://example.com/R03C01 Software:" >> ~/.gtk-bookmarks
fi

Dès que j'ai eu une fonction comme celle-ci:

####
# Function find_server_by_ip()
# Desc : This function find the server to use for the current Host IP Address
# Parameters : None
# Return : echo Server to use
####
function find_server_by_ip()
{
        hostname_ip=$(hostname -I)
        IFS="."
        set -- $hostname_ip

        if [[ $3 -eq 78 ]]
        then
                echo "Server A"
        else
                echo "Server B"
        fi
}

... la connexion cesse de fonctionner. Ce qui me déroute, c'est que l'exécution de ce script avec * bash add_shortcut.sh * ou *./Add_shortcut.sh * fonctionne bien ...

Est-il possible que nous ne puissions pas créer de fonctions, d'analyser des tableaux ou quelque chose comme ça dans un script appelé par/etc/profile? Et dans ce cas, où ou comment puis-je exécuter un script de connexion pour tous les utilisateurs se connectant à l'ordinateur? Oh, par la façon dont j'utilise Ubuntu 12.04 LTS!

Merci d'avance et désolé pour mon anglais!

EDIT: Il y a une Pastebin du script. Je ne l'ajoute pas de manière contraignante car les commentaires du script sont en français donc ... eh bien, ça y est: http://Pastebin.com/71XzaBk6 .

4
Patrick Pruneau

Les trucs dans /etc/profile.d proviennent probablement de votre gestionnaire de fenêtres lorsque vous vous connectez, et qui utilise probablement/bin/sh, donc ciblez un shell POSIX, pas bash, pour y ajouter des scripts. Notez que [[ Ne se trouve pas dans les scripts qui s'y trouvent actuellement.

Donc,

  • choisissez [ ... ] plutôt que [[ ... ]]
  • utiliser funcname() { ... } sans le mot clé function

dash est un shell POSIX (uniquement), vous pouvez donc trouver dash man page handy


Commentaires sur http://Pastebin.com/71XzaBk6

  • Il s'agit de l'erreur principale: modifier

    if [[ ! -f ~/.gtk-bookmarks ]]
    

    à

     if [ ! -f ~/.gtk-bookmarks ]
    
  • la fonction find_server_by_ip peut être simplifiée:

    findserverbyip() {
        case "$(hostname -I)" in 
            *[0-9].33.9.[0-9]*) share_server=serverB ;;
            *)                  share_server=serverA ;;
        esac
    }
    

    De plus, ce commentaire est trompeur: la fonction ne renvoie rien, elle a un effet secondaire.

    # Return : echo Server to use
    
  • autant supprimer la ligne Shebang: ce script n'est pas exécuté, il est sourcé.

1
glenn jackman