Что-то не так с моим `.profile`

Недавно я установил несколько программ, и мне нужно было добавить их bin/ каталоги в мою PATH. Пока ничего ненормального. Но я решил проявить смекалку и переписал часть своего .profile, чтобы мне не приходилось копировать / вставлять одни и те же строки кода снова и снова. Вот моя идея:

# Create an array with directories to be added to PATH
declare -a addpath=("$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin")

# Add directories recursively
for dir in "${addpath[@]}"; do
if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
fi
done

Я думал, что это сработало хорошо ... пока я не перезагрузил свой компьютер и не был заблокирован из сеанса при попытке войти в систему. Мне потребовалось некоторое время, чтобы выяснить, что это было на самом деле из-за моего .profile; как только я прокомментировал эти строки, я смог войти в свою сессию, не приходя в норму.

Мой вопрос; что я сделал не так с этими строками? Есть ли синтаксическая ошибка? Есть ли другой / лучший способ сделать это? Что случилось?

4
задан 20 August 2013 в 03:55

2 ответа

В настройке по умолчанию в Ubuntu 12.04 файл .profile загружается /usr/sbin/lightdm-session. Это сценарий оболочки, выполненный /bin/sh.

На Ubuntu /bin/sh - тире . Вы использовали функции bash , которые не поддерживаются. Dash и Bash оба имеют одинаковые базовые функции, но при этом быстрое и компактное использование этих основных функций связано с тем, что bash добавляет множество функций за счет увеличения ресурсов. Обычно для сценариев, которые не нуждаются в дополнительных функциях, используется dash, а для интерактивного использования bash (хотя zsh имеет много приятных функций ).

У Dash нет ни массивов, ни встроенных declare, поэтому на этой линии бомбардировка. Вы можете поместить список путей в строку:

for dir in "$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin"; do
  if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
  fi
done

См. не указывать дубликаты из $ PATH в источнике , если вы хотите, чтобы не было дубликатов записей.


Вместо того, чтобы добавлять новые каталоги в PATH для каждой устанавливаемой программы, вы можете вместо этого установить символические ссылки в существующий каталог. Для ~/.cabal/bin вы захотите иметь его в своем пути, потому что исполняемые файлы будут приходить и уходить; Я бы поставил его в конце PATH, чтобы избежать потенциальных конфликтов с существующими программами в вашей системе. ~/bin уже есть в вашем PATH на Ubuntu. Для программ, которые вы устанавливаете вручную, таких как vert.x, stow или xstow удобны для управления символическими ссылками. См. Отслеживание программ для введения в укладку.

0
ответ дан 20 August 2013 в 03:55

Я думаю, что в вашем случае лучший способ сделать ваши двоичные файлы доступными в качестве команд - это связать то, что вам нужно, с / usr / bin. Неразбериха с $ PATH не всегда полезна.

Вы можете использовать 'cp' для рекурсивного создания символических ссылок, например:

cp -rs $HOME/bin/* /usr/bin #This will link all non hidden files
cp -rs $HOME/bin/.[^.]* /usr/bin # This will link all the hidden files

Просто приспособьте это к вашему сценарию, используя ту же логику, что и в вашем нынешнем коде.

РЕДАКТИРОВАТЬ: вы можете использовать только первую строку приведенного выше кода, если вы установите для dotglob значение true в bash. Например:

shopt -s dotglob #This will make Bash include filenames beginning with a '.' in the results of filename expansion
cp -rs $HOME/bin/* /usr/bin #Now, this will link ALL files in that directory to the destination

РЕДАКТИРОВАТЬ 2: Как вы можете прочитать в комментариях ниже, предпочтительно, чтобы вы использовали / usr / local / bin вместо / usr / bin. Прочитайте комментарии, чтобы понять, почему.

0
ответ дан 20 August 2013 в 03:55

Другие вопросы по тегам:

Похожие вопросы: