Algo errado com o meu '.profile'

4

Eu recentemente instalei alguns softwares e precisei adicionar seus diretórios bin/ ao meu PATH . Nada anormal até agora. Mas decidi ser esperto e reescrevi uma parte do meu .profile , então não precisei copiar / colar as mesmas poucas linhas de código repetidas vezes. Aqui estava 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 achei que isso funcionou bem .. até que eu reiniciei meu PC e fui bloqueado 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, consegui 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?

    
por Sheljohn 20.08.2013 / 01:55

2 respostas

6

No traço . Você usou recursos do bash que o 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 dash para scripts que não precisam dos recursos extras e bash para uso interativo (embora zsh tem muitos recursos mais agradáveis ).

O Dash não tem arrays, nem o declare integrado, 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

Consulte manter duplicados fora de $ PATH na origem se você quiser ter certeza de não ter 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ê desejará 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, stow ou xstow é bom para gerenciar links simbólicos. Consulte Como acompanhar os programas para uma introdução ao armazenamento.

    
por Gilles 20.08.2013 / 09:40
-2

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

Você pode usar o '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 o dotglob para true no bash. Assim:

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 o motivo.

    
por Alexandre Teles 20.08.2013 / 02:59