将脚本添加到 /etc/profile.d 后无法登录

将脚本添加到 /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!

提前致谢并且抱歉我的英语不好!

编辑:有一个脚本的 pastebin。我没有完整地添加它,因为脚本注释是法语的,所以...好吧,它在那里:http://pastebin.com/71XzaBk6

答案1

/etc/profile.d 中的内容可能是您登录时窗口管理器提供的,并且可能使用 /bin/sh,因此请将 POSIX shell(而不是 bash)作为要添加脚本的目标。请注意,[[目前在其中的脚本中找不到。

所以,

  • 选择[ ... ][[ ... ]]
  • funcname() { ... }不使用function关键字

dash 是一个 POSIX (唯一) shell,因此你可能会发现dash 手册页便利


评论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 行:这个脚本不会被执行,而是会被获取。

相关内容