Что такое «$ PATH» и «~ / bin»? Как я могу иметь личные сценарии?

29

Что такое $PATH?

Как я могу иметь команды / программы, которые доступны только для меня?
Я видел этот путь, ~/binупомянутый ранее, но для чего он используется и как его использовать?

Braiam
источник
Я немного экспериментирую, потому что это больше FAQ или вики, чем «реальный вопрос». Это было вызвано тем, что я упомянул ~ / bin в предыдущем ответе (на связанной боковой панели справа) и кто-то прокомментировал, как добавить его в PATH: теперь вместо кратких комментариев мы можем ссылаться на этот пост, когда ~ / bin упоминается.

Ответы:

26

$ PATH - это переменная окружения, используемая для поиска команд. ~ Ваш домашний каталог, поэтому ~ / bin будет / home / user / bin; это нормальный каталог.

Например, когда вы запускаете «ls» в оболочке, вы фактически запускаете программу / bin / ls; точное местоположение может отличаться в зависимости от конфигурации вашей системы. Это происходит потому, что / bin находится в вашем $ PATH.

Чтобы увидеть путь и найти, где находится какая-либо конкретная команда:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

Чтобы иметь свой собственный каталог bin, вам нужно всего лишь добавить его в путь. Сделайте это, отредактировав ~ / .profile (скрытый файл), чтобы включить строки ниже. Если строки закомментированы, вам нужно только раскомментировать их; если они уже есть, у вас все готово!

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

Теперь вам нужно создать каталог ~ / bin, и, поскольку .profile запускается при входе в систему и добавляет ~ / bin только в том случае, если он существует в то время, вам нужно снова войти в систему, чтобы увидеть обновленный PATH.

Давайте проверим это:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

источник
3
Одна вещь, на которую следует обратить внимание при использовании, это то, что он будет находить только команды, являющиеся двоичными файлами в файловой системе, он не сообщает о встроенной оболочке, псевдонимах или функциях. Часто более полезно использовать, typeчтобы увидеть, как фактическая команда будет решена оболочкой; Например: which echoи type echoсообщит о разных вещах, whichвозвращает «/ bin / echo», но «type» возвращает, что это встроенная оболочка, которую оболочка предпочтет над файлом в «/ bin».
Стив Битти
@ Стив Битти, +1. whichлучше заменить на typeили commandв интерактивных оболочках, и это абсолютно бесполезно в сценариях.
Гейра
Стоит отметить, что я только что заметил - $HOMEпеременная в $PATHкакой-то причине не работает, то есть ~вместо нее нужно использовать знак.
Привет, Ангел,
19

Относительно ~/binи команды / программы доступны только для вашего пользователя

Последние версии Ubuntu включают в себя ~/binкаталог $PATH, но только если ~/binкаталог существует.

Если он не существует:

  1. Убедитесь, что ваш ~/.profileраздел содержит следующую строфу (по умолчанию ~/.profileуже есть):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Создайте ~/binкаталог:

    mkdir -p ~/bin
    
  3. Перезагрузите компьютер или принудительно перечитайте bash ~/.profile:

    exec -l bash
    
Данило Пьяццалунга
источник
Спасибо за exec -l bashподсказку «перезагрузка или ». Что делает -lфлаг? Я не нахожу объяснения в man exec.
evanrmurphy
3
exec -lвыполнит bash в качестве оболочки для входа [ wiki.bash-hackers.org/commands/builtin/exec] . Короче говоря, это заставит Bash перечитать /etc/profileи ~/.profile. Просто работает exec bashбудет только перечитать ~/.bashrc.
Данило Пьяццалунга