Не удается войти после добавления скрипта в /etc/profile.d

4

Я создал небольшой скрипт для добавления закладок в 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 [[  -eq 78 ]]
        then
                echo "Server A"
        else
                echo "Server B"
        fi
}

... логин перестает работать. Что меня озадачивает, так это то, что запуск этого скрипта с помощью * bash add_shortcut.sh * или *. / Add_shortcut.sh * отлично работает ...

Возможно ли, что мы не можем создавать функции, анализировать массивы или что-то подобное в скрипте, вызванном / etc / profile? И в таком случае, где и как я могу выполнить скрипт входа для всех пользователей, подключающихся к компьютеру? О, кстати, я запускаю Ubuntu 12.04 LTS!

Спасибо заранее и извините за мой английский!

ИЗМЕНИТЬ: Существует скрипка скрипта. Я не добавляю его со всей уверенностью, так как комментарии скриптов на французском языке так ... ну, вот оно: Ссылка .

    
задан Patrick Pruneau 19.03.2014 в 21:22
источник

1 ответ

1

Материал в файле /etc/profile.d, вероятно, найден вашим диспетчером окон при входе в систему и, вероятно, использует / bin / sh, поэтому нацеливаем на оболочку POSIX, а не bash, для добавления скриптов. Обратите внимание, что [[ не найдено в скриптах, которые находятся там сейчас.

Итак,

  • выберите [ ... ] over [[ ... ]]
  • используйте funcname() { ... } без ключевого слова function

dash - это оболочка POSIX (только), поэтому вы можете найти страницу с тире удобный

Комментарии Ссылка

  • Это основная ошибка: Изменить

    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: этот скрипт не выполняется, он получает источники.

ответ дан glenn jackman 19.03.2014 в 21:31