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

10

В ~/.profile есть строка, которая

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

Я не уверен в последнем i .

  • Должен ли я удалить его?
  • Разве это не синтаксическая ошибка ??
задан Smile 07.12.2017 в 09:26
источник

3 ответа

12

Нет, это не синтаксическая ошибка; это просто письмо, которое добавляется после расширения $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 , чтобы восстановить свой PATH.

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

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

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

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

    
ответ дан Zanna 07.12.2017 в 09:39
источник
4

Да, это синтаксическая ошибка, фактический .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 07.12.2017 в 09:29
3

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

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 07.12.2017 в 10:02