Execute um script de shell através de um link simbólico do diretório que contém o próprio script

2

Meu desejo não é mudar de diretório e então executar. Eu uso um arquivo jar e preciso executá-lo. Então eu fiz um script de shell muito básico para fazer isso.

#!/bin/sh
java -jar TreeForm.jar

Em seguida, salvei-o como TreeForm , não TreeForm.sh . Em seguida, criei um link simbólico como abaixo:

ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm

É criado com sucesso. No entanto, quando corro, recebo o erro abaixo do JAVA.

Error: Unable to access jarfile TreeForm.jar

Portanto, parece que o shell script não executa seu próprio diretório ou não examina isso, mas funciona no diretório atual. Eu realmente não quero modificar meu arquivo de script dando caminho completo de TreeForm.jar . Então, eu queria perguntar, existe uma maneira de encontrar um arquivo relativo ao arquivo de script sem alterar o caminho atual ou adicionar caminho à variável PATH ? Ou existe alguma variável que tenha o caminho do script, não o atual?

    
por Eray Erdin 19.03.2016 / 19:03

3 respostas

7

O shell não será alterado para outro diretório, a menos que você o informe. Se você quiser que seu script execute comandos em um diretório diferente, chame cd do seu script.

O caminho para o script está disponível como "$0" . Se o script é um link simbólico, esse é o caminho para o link simbólico. Se você deseja obter o destino final do link simbólico, chame realpath ( disponível na maioria, mas não em todos os unices modernos; ele está disponível no Linux (GNU e BusyBox), FreeBSD e Solaris 11, mas não no OSX.

cd "$(dirname "$(realpath "$0")")"

realpath é uma adição relativamente recente aos núcleutils GNU; se sua versão for muito antiga, você poderá usar readlink -f , que é mais antigo. Para sistemas não-GNU, se realpath não estiver presente, então readlink pode ser, mas normalmente olha apenas através de um nível de links simbólicos, a maioria das implementações readlink não tem a opção -f para fazer o completo resolução.

    
por 19.03.2016 / 19:21
1

Você pode derivar o diretor no qual o script de shell existe do parâmetro $0 . Por exemplo, você pode usar dirname para fazer isso no script:

cd $(dirname "$0")

Isso pressupõe que seu arquivo jar esteja no mesmo diretório em que o script está.

Se você quiser referenciar o script por meio de um link simbólico (e ainda assim, supondo que o script e o jar-file estejam no mesmo diretório), você pode fazer isso com um script mais complicado que

  • encontre o nome do caminho para $0 (simples, se você usar a pesquisa padrão $PATH ) e
  • use um programa como readlink para ler o link simbólico. Isso não é POSIX, mas existe em muitos sistemas Linux.
  • se você não tiver readlink , é possível com outras soluções alternativas (incluindo a leitura da saída de ls ).
  • no entanto, você lê o link, cd para esse local.

Leitura adicional:

por 19.03.2016 / 19:06
0
  1. Remova o link simbólico
  2. Executar: PATH=$PATH:/opt/TreeForm/ then export PATH

Para tornar a alteração persistente, adicione o comando do segundo ponto ao seu arquivo .bashrc (no diretório inicial do usuário). Se você quiser global (para todos os usuários), adicione-o a /etc/bash.bashrc

    
por 19.03.2016 / 19:11