Недавно я установил несколько программных продуктов и должен был добавить их 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
; как только я прокомментировал эти строки, я смог войти в свою сессию, не возвращаясь назад.
Мой вопрос: что я сделал с этими строками? Есть ли синтаксическая ошибка? Есть ли другой / лучший способ сделать это? Что случилось?
в настройка по умолчанию на Ubuntu 12.04, .profile
файл загружается /usr/sbin/lightdm-session
, Это сценарий оболочки, выполняемый /bin/sh
,
На Ubuntu, /bin/sh
является тир, Вы использовали функции удар что тире не поддерживается. У Dash и Bash есть одни и те же основные функции, но штрихи к этим основным функциям, чтобы быть быстрыми и маленькими, в то время как bash добавляет множество функций за счет того, что требуется больше ресурсов. Обычно используется тире для скриптов, которые не нуждаются в дополнительных функциях и bash для интерактивного использования (хотя ЗШ имеет много приятных функций).
В тире нет массивов, 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, набивать или xstow хорошо подходит для управления символическими ссылками. Видеть Отслеживание программ для введения в укладку.
Я думаю, что в вашем случае лучше всего использовать ваши двоичные файлы в качестве команд, чтобы связать то, что вам нужно, в / 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
Просто адаптируйте это к своему сценарию, используя ту же логику вашего настоящего кода.
EDIT: вы можете использовать только первую строку вышеприведенного кода, если установить dotglob в правда на баш. Как это:
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
EDIT 2: как вы можете прочитать комментарии ниже, предпочтительнее использовать / usr / local / bin вместо / usr / bin. Прочтите комментарии, чтобы понять, почему.