Вопрос Что-то не так с моим `.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
2017-08-19 23:55


происхождения




ответы:


в настройка по умолчанию на 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 хорошо подходит для управления символическими ссылками. Видеть Отслеживание программ для введения в укладку.


6
2017-08-20 07:40



Извините за то время, которое потребовалось мне, чтобы вернуться к вам. спасибо так многое для вашего подробного ответа, я определенно узнал что-то прямо здесь! - Sheljohn


Я думаю, что в вашем случае лучше всего использовать ваши двоичные файлы в качестве команд, чтобы связать то, что вам нужно, в / 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. Прочтите комментарии, чтобы понять, почему.


-2
2017-08-20 00:59



Все наоборот. Вы никогда не должны /usr/bin, пусть менеджер пакетов управляет им. Вы можете добавить программы для /usr/local/bin, а как символические ссылки, а не как копии. - Gilles
Если вы прочтете мой код, вы увидите, что я не использую копии. 'cp' может писать символические ссылки вместо копирования. Это более просто, что делает все символические ссылки «ln». То, что вы говорите о / usr / bin, может быть наполовину истинным здесь, на Ubuntu (который фактически использует диспетчер пакетов), но не является глобальной истиной, помните об этом. P.S .: НИКОГДА не странное слово в мире Linux. Вы можете, очевидно, сделать это (и все будет работать в большинстве случаев). Разница здесь в том, что / usr / bin поддерживает управляемое распределением программное обеспечение, а / usr / local / bin - другое программное обеспечение. Но это соглашение, а не техническая проблема. - Alexandre Teles
Да, я пропустил -s, Но основная часть моего возражения все еще стоит: не путайте с /usr/bin, Это верно для Ubuntu и почти любого другого unix. Конечно, это не закон физики. Это конвенция, например, движение по определенной стороне дороги. Некоторые конвенции важны. - Gilles
@AlexandreTeles Большое спасибо за ваш ответ. Я знаю, что сокращение вниз может быть очень неприятным; вы намерены помочь, и вы получили «наказание» взамен. Я очень сожалею об этом (я не сделал ни малейшего влияния, даже если бы мне пришлось). По правде говоря, вы на самом деле ошибаетесь, но я рекомендую вам прочитать следующие две статьи, чтобы узнать, почему: wiki.debian.org/FilesystemHierarchyStandard а потом unix.stackexchange.com/questions/11544/..., С уважением :) - Sheljohn