Исправление установки пути в файле ~ / .profile

11

Есть строка, в ~/.profileкоторой есть

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Я не уверен насчет последнего i.

  • Должен ли я удалить это ??
  • Разве это не ошибка синтаксиса?
Улыбка
источник
4
@dessert Я не уверен, что это дубликат. Я согласен, что оба относятся к $PATHпеременной среды, но они не являются дубликатами вообще. В лучшем случае они связаны между собой. Этот вопрос - проблема, в ~/.profileкоторой просто оказывается дополнительный символ в строке, где назначена $PATHсреда.
Дан
@Dan Ответ с наибольшим количеством голосов (!) В дублирующем вопросе объясняет, как должна выглядеть PATH=строка в, ~/.profileчтобы быть действительной - что является реальным вопросом здесь.
десерт
1
@dessert, что OP имеет здесь, совершенно правильно, это не проблема неверного формата. Это работает, это просто не делает ничего полезного.
тердон
2
Да, я использую редактор vi. Возможно, я случайно положил «я» в файл, как сказал десерт. Но тогда мне пришлось: wq, чтобы сделать его эффективным. Я думаю, что не сделал этого, но, учитывая мой уровень, я мог бы сделать какую-то глупость.
Улыбнись

Ответы:

13

Нет, это не синтаксическая ошибка; это просто письмо, которое добавляется после раскрытия $PATH, потому что оболочка удаляет кавычки ...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Таким образом, помимо добавления локальных каталогов, он фактически удалил существующие /snap/binиз моего PATH и добавил несуществующие /snap/bini.

Вы можете удалить, iчтобы восстановить ваш путь.

Чтобы увидеть изменения, вам нужно выйти из системы и снова войти в нее или запустить source ~/.profileв любой используемой вами оболочке (или запустить оболочку bash -l), поскольку .profileона читается только оболочками входа в систему .

Если вы не сделали это изменение .profileсамостоятельно, вы можете восстановить файл по умолчанию, запустив

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Это переименовывает старый .profile .profile.old(вы также можете удалить файл, если хотите) и заменяет его версией по умолчанию для вашей системы /etc/skel.

Занна
источник
5

Я думаю, что здесь неясно, что означает следующее выражение:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Первая часть PATH=означает, что мы присваиваем новое значение переменной (environment) $PATH.

Вторая часть - это новое значение этой переменной. В текущем случае переменная $HOMEбудет расширена с ее текущим значением, и к этому значению будет добавлена ​​строка /bin:. То же самое относится и к следующей части строки $HOME/.local/bin:. Наконец, текущее (предыдущее) значение $PATHпеременной будет расширено и добавлено. Двоеточие :играет роль разделителя в PATHвыражении.

Цель состоит в том, чтобы в конечном счете , пишет: PATH=<some additional paths>+<the the current value of $PATH>. Мы помещаем эти дополнительные пути перед строкой, потому что мы хотим, чтобы оболочка искала исполняемые файлы сначала в этих местах, а затем в масштабе всей системы.

Персонаж iне нужен. Он будет добавлен к новому значению $PATHи создаст беспорядок, как объясняет @Zanna в своем ответе .

pa4080
источник
5

Да, это синтаксическая ошибка, фактическая .profileдолжна выглядеть следующим образом, если вы не изменили ситуацию (это версия 17.10, см. Примечания под ней):

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Это может выглядеть иначе в более старых версиях Ubuntu, где проверка наличия binкаталога users не была включена в .profile. Самый простой способ проверить, как это должно выглядеть - это посмотреть /etc/skel/.profile.

Таким образом, чтобы добавить, как вы просили в своем комментарии, просто поместите это в конец вашего профиля:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

Если вы когда-нибудь испортили свой профиль полностью, есть копия, где вы можете получить новый /etc/skel/.

Videonauth
источник
1
У меня есть одна дополнительная строка «экспорт PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin», потому что я установил его. Это нормально ??
Улыбнись
3
Эта строка в порядке, я включил ее в свой пример, чтобы показать, где ее разместить.
Видеонавт
1
Обратите внимание, что /etc/skel/.profileв 16.04 выглядит иначе, без проверки, "$HOME/bin"существует ли . Даже если бы это был лучший вариант (IMO), он, кажется, был изменен в 17.10 - по причине или по ошибке.
Гуннар
@GunnarHjalmarsson заметит это в моем посте, и да, это skel / .profile от 17.10, на котором я работаю.
Видеонавт