web-dev-qa-db-ja.com

/etc/profile.dにスクリプトを追加した後にログインできません

Nautilusにブックマークを追加して、ユーザーをネットワーク共有にリダイレクトする小さなスクリプトを作成しました。スクリプトを手動で実行した場合、すばらしい動作をしますが、/ etc/profile.dにスクリプトを追加しようとするとすぐにコンピューターに接続できません。ループまたはそのような「派手な」何かを実行するとすぐに、スクリプトがエラーを出すようです。以下は、現在動作しているスクリプトの例です。

#!/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

このような関数ができたらすぐに:

####
# 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
}

...ログインが停止します。私を困らせているのは、このスクリプトを* bash add_shortcut.sh *または*。/ add_shortcut.sh *で実行するとうまく機能するということです...

/ etc/profileによって呼び出されるスクリプトでは、関数を作成したり、配列を解析したり、そのようなものを作成したりすることはできませんか?その場合、コンピューターに接続しているすべてのユーザーに対してログインスクリプトをどこで、またはどのように実行できますか?ああ、ところで私はUbuntu 12.04 LTSを実行しています!

事前に感謝し、私の英語を申し訳ありません!

編集:スクリプトのペーストビンがあります。スクリプトのコメントはフランス語なので、完全に追加することはしません...そうですね、 http://Pastebin.com/71XzaBk6 です。

4
Patrick Pruneau

/etc/profile.dの内容は、おそらくログイン時にウィンドウマネージャーによって供給され、おそらく/ bin/shを使用するため、bashではなくPOSIX Shellをターゲットとしてスクリプトを追加します。 _[[_は、現在そこにあるスクリプトにはないことに注意してください。

そう、

  • _[ ... ]_よりも_[[ ... ]]_を選択します
  • functionキーワードなしでfuncname() { ... }を使用します

dashはPOSIX(のみ)シェルであるため、 dashのmanページ が便利です


http://Pastebin.com/71XzaBk6 に対するコメント

  • これが主なエラーです:変更

    _if [[ ! -f ~/.gtk-bookmarks ]]
    _

    _ if [ ! -f ~/.gtk-bookmarks ]
    _
  • _find_server_by_ip_関数は単純化できます:

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

    また、このコメントは誤解を招くものです。関数は何も返さず、副作用があります。

    _# Return : echo Server to use
    _
  • shebang行を削除することもできます。このスクリプトは実行されず、ソースされます。

1
glenn jackman