O que são "$ PATH" e "~ / bin"? Como posso ter scripts pessoais?

29

O que é $PATH?

Como posso ter comandos / programas que estão disponíveis apenas para mim?
Eu já vi esse caminho ~/binmencionado anteriormente, mas para que é usado e como o uso?

Braiam
fonte
Estou experimentando um pouco, porque isso é mais FAQ ou material wiki do que uma "questão real". Foi solicitado porque mencionei ~ / bin em uma resposta anterior (na barra lateral vinculada à direita) e alguém comentou sobre como adicioná-lo ao PATH: agora, em vez de breves comentários, podemos vincular este post quando ~ / bin é mencionado.

Respostas:

26

$ PATH é uma variável de ambiente usada para procurar comandos. O ~ é o seu diretório pessoal, então ~ / bin será / home / user / bin; é um diretório normal.

Quando você executa "ls" em um shell, por exemplo, na verdade você executa o programa / bin / ls; a localização exata pode variar dependendo da configuração do sistema. Isso acontece porque / bin está no seu $ PATH.

Para ver o caminho e descobrir onde está localizado qualquer comando específico:

$ 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  ...

Para ter seu próprio diretório bin privado, você só precisa adicioná-lo ao caminho. Faça isso editando ~ / .profile (um arquivo oculto) para incluir as linhas abaixo. Se as linhas forem comentadas, você precisará apenas descomentá-las; se eles já estiverem lá, está tudo pronto!

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

Agora você precisa criar seu diretório ~ / bin e, como .profile é executado no login e só adiciona ~ / bin se existir naquele momento, é necessário efetuar login novamente para ver o PATH atualizado.

Vamos testá-lo:

$ 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  ...

fonte
3
Uma coisa a ser observada ao usar é que ele encontrará apenas comandos binários no sistema de arquivos, mas não relata funções, aliases ou funções internas do shell. Geralmente, é mais útil usar typepara ver como um comando real será resolvido pelo shell; por exemplo: which echoe type echorelatará coisas diferentes, whichretorna '/ bin / echo', mas 'type' retorna que é um shell embutido, o qual o shell preferirá sobre o arquivo em '/ bin'.
Steve Beattie
@ Steve Beattie, +1. whiché melhor substituído por typeou commandem shells interativos e é completamente inútil em scripts.
Geirha #
Uma coisa a notar que eu acabei de notar - a $HOMEvariável variável $PATHpor algum motivo não funciona, ou seja, é preciso usar o ~sinal.
Hi-Angel
19

Em relação a ~/bincomandos / programas disponíveis apenas para o usuário

Versões recentes do Ubuntu incluem o ~/bindiretório no seu $PATH, mas somente se o ~/bindiretório existir.

Se não existir:

  1. Verifique se você ~/.profilecontém a seguinte estrofe (o padrão ~/.profilejá existe):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Crie o ~/bindiretório:

    mkdir -p ~/bin
    
  3. Reinicie o computador ou force o bash a reler ~/.profile:

    exec -l bash
    
Danilo Piazzalunga
fonte
Obrigado pela exec -l bashdica "reiniciar ou ". O que a -lbandeira faz? Não estou encontrando uma explicação no man exec.
evanrmurphy
3
exec -lexecutará o bash como um shell de login [ wiki.bash-hackers.org/commands/builtin/exec] . Em suma, força o bash a reler /etc/profilee ~/.profile. A execução exec bashapenas relerá ~/.bashrc.
Danilo Piazzalunga 19/10/2013