Questão Algo errado com o meu `.profile`


Recentemente instalei alguns softwares e precisei adicionar seus bin/ diretórios para o meu PATH. Nada anormal até agora. Mas eu decidi ser inteligente sobre isso e reescrevi uma parte do meu .profile então eu não precisei copiar / colar as mesmas linhas de código várias vezes. Aqui foi a minha ideia:

# 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

Eu pensei que isso tinha funcionado bem .. até que eu reiniciei meu PC e fui bloqueado para fora da minha sessão ao tentar fazer o login. Demorei um pouco para descobrir que era realmente por causa do meu .profile; Uma vez que eu comentei essas linhas, fui capaz de entrar na minha sessão sem ser devolvido.

Minha pergunta é; O que eu fiz de errado com essas linhas? Existe um erro de sintaxe? Existe outra maneira melhor de fazer isso? O que aconteceu?


4
2017-08-19 23:55


origem




Respostas:


No configuração padrão no Ubuntu 12.04, a .profile o arquivo é carregado por /usr/sbin/lightdm-session. Este é o shell script, executado por /bin/sh.

No Ubuntu, /bin/sh é traço. Você usou recursos de festança esse traço não suporta. O Dash e o Bash têm os mesmos recursos centrais, mas o traço se limita a esses recursos principais para ser rápido e pequeno, enquanto o bash acrescenta muitos recursos com o custo de exigir mais recursos. É comum usar o dash para scripts que não precisam dos recursos extras e bash para uso interativo (embora zsh  tem muitos recursos mais agradáveis).

Dash não tem arrays, nem o declare built-in, por isso está bombardeando nessa linha. Você pode colocar a lista de caminhos em linha:

for dir in "$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin"; do
  if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
  fi
done

Vejo manter duplicatas fora de $ PATH na origem se você quiser ter certeza de não acabar com entradas duplicadas.


Em vez de adicionar novos diretórios ao PATH para cada programa que você instala, convém configurar os links simbólicos em um diretório existente. Para ~/.cabal/bin, você vai querer tê-lo em seu caminho porque os executáveis ​​estarão indo e vindo; Eu coloquei no final do PATH, para evitar possíveis conflitos com os programas existentes em seu sistema. ~/bin já está no seu PATH no Ubuntu. Para programas que você instala manualmente, como o vert.x, arrumar ou xstow é bom para gerenciar links simbólicos. Vejo Acompanhando os programas para uma introdução para arrumar.


6
2017-08-20 07:40



Desculpe pelo tempo que levei para voltar para você. Obrigado assim por sua resposta detalhada, eu definitivamente aprendi alguma coisa aqui! - Sheljohn


Eu acho que, no seu caso, a melhor prática para tornar seus binários disponíveis como comandos é ligar o que você precisa ao / usr / bin. Mexer com $ PATH não é sempre uma boa coisa a fazer.

Você pode usar 'cp' para criar links simbólicos, recursivamente, assim:

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

Apenas adapte isso ao seu cenário, usando a mesma lógica do seu código atual.

EDIT: você pode usar apenas a primeira linha do código acima, se você definir dotglob para verdade na festa. Como isso:

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: Como você pode ler nos comentários abaixo, é preferível usar / usr / local / bin em vez de / usr / bin. Leia os comentários para entender por quê.


-2
2017-08-20 00:59



É exatamente o oposto. Você nunca deve mexer com /usr/bin, deixe o gerenciador de pacotes gerenciá-lo. Você pode adicionar programas para /usr/local/bin, mas como links simbólicos, não como cópias. - Gilles
Se você ler meu código, verá que não estou usando cópias. 'cp' pode escrever links simbólicos em vez de copiar. Isto é mais simples que faz todos os links simbólicos com 'ln'. O que você diz sobre / usr / bin pode ser meio verdadeiro aqui no Ubuntu (que na verdade usa um gerenciador de pacotes) mas não é uma verdade global, lembre-se disso. P.S .: NUNCA é uma palavra estranha no mundo do Linux. Você pode, obviamente, fazer isso (e tudo funcionará na maioria dos casos). A diferença aqui é que o / usr / bin hospeda o software gerenciado pela distribuição, e o / usr / local / bin hospeda o outro software. Mas isso é uma convenção, não um problema técnico. - Alexandre Teles
Oh, certo, eu perdi o -s. Mas a parte principal da minha objeção ainda permanece: não mexa com /usr/bin. É verdade no Ubuntu e praticamente qualquer outro unix. Claro, não é uma lei da física. É uma convenção, como dirigir em um determinado lado da estrada. Algumas convenções são importantes. - Gilles
@AlexandreTeles Muito obrigado pela sua resposta. Eu sei que ser downvoted pode ser muito frustrante; sua intenção era ajudar e você foi "castigado" em troca. Eu realmente sinto muito sobre isso (eu não me rebaixei, mesmo que eu devesse). A verdade é que você está realmente errado, mas eu o encorajo a ler os dois artigos seguintes para descobrir o porquê: wiki.debian.org/FilesystemHierarchyStandard e depois unix.stackexchange.com/questions/11544/…. Verdadeiramente seu :) - Sheljohn