Como fazer um script que usa o trabalho de $ 0 quando está no $ PATH?

0

Eu tenho um script (~ /.../ gremlin) que criei um link para:

ln -s ~/[...]/gremlin ~/sc/gremlin

~/sc/gremlin está em $PATH .
Chamar o script funciona diretamente. Chamar pelo link não faz isso.
Usa dirname $0 para não receber nada.

Existe uma maneira de fazer essa configuração funcionar sem alterar o script e sem criar outro no lugar do link flexível?

É assim que $ 0 é usado:

case 'uname' in
  CYGWIN*)
    CP=$( echo 'dirname $0'/../lib/*.jar . | sed 's/ /;/g')
    ;;
  *)
    CP=$( echo 'dirname $0'/../lib/*.jar . | sed 's/ /:/g')
esac
    
por Ondra Žižka 26.09.2016 / 19:52

3 respostas

1

Se o uso de dirname $0 é um problema ou não, dependerá de como é usado. Sem mais detalhes, não podemos responder a isso.

Se (a) o uso de dirname $0 for um problema e (b) você não puder alterar o script, a solução é substituir o link flexível ~/sc/gremlin por um script:

#!/bin/sh
exec ~/../gremlin "$@"

Dessa forma, ~/../gremlin será executado com um $0 correto.

O uso de exec significa que o processo que está executando o script ~/../gremlin substituirá o processo que está executando ~/sc/gremlin . Isso é mais eficiente do que manter os dois processos em volta até que ~/../gremlin seja concluído.

    
por 27.09.2016 / 00:40
1

Se você quiser derivar o diretório ~/... de $0 , em oposição a ~/sc de dentro do script, poderá fazer:

Se for um script zsh :

#! /bin/zsh -
dir=$0:A:h

Caso contrário, e desde que você tenha um comando readlink que se comporta como o do GNU (alguns sistemas têm um comando realpath que você pode usar em seu lugar):

#! /bin/sh -
dir=$(dirname -- "$(readlink -f -- "$0")")

readlink -f e $0:A fornecem o caminho canônico do arquivo, que é um caminho absoluto após a resolução de todos os links simbólicos em todos os componentes do caminho.

E então:

set -- "$dir"/../lib/*.jar .
case $(uname) in
  CYGWIN*) IFS=';';;
  *)       IFS=:;;
esac
CP="$*"

Ou:

case $(uname) in
  CYGWIN*) sep=';';;
  *)       sep=:;;
esac
CP=$(printf "%s$sep" "$dir"/../lib/*.jar).
    
por 27.09.2016 / 15:11
0

Como @ john1024 apontou, o erro na pergunta do OP pode ser o ponto da questão:

ln -s ~/.../gremlin ~/sc/gremlin

Embora alguns aplicativos honrem os pontos triplos, os sistemas de arquivos Unix não. Seu shell expande o ~ (til), não o ln , então

    ln -s ~/../gremlin ~/sc/gremlin

expande o nome do caminho conforme o esperado. Se o link já existir, você poderá substituí-lo usando a opção -f . No entanto, se o destino for um arquivo real, a opção -f substituirá silenciosamente o arquivo por um link simbólico. Você pode querer usar a opção -i , que, pelo menos, diz que já existe algo lá.

Se você quiser validar o link (provar que ele aponta para um arquivo), a opção -L de ls é útil:

ls -lL ~/sc/gremlin

Se não for um arquivo, ls (dependendo da implementação) mostrará apenas um l para o tipo (o primeiro caractere da listagem), com pontos de interrogação para os bits de permissão) ou alguma outra indicação que ele não está apontando para um arquivo real (o OSX simplesmente se recusa a mostrar qualquer coisa neste caso, embora conte o tamanho do link simbólico no total).

Leitura adicional:

por 27.09.2016 / 00:44

Tags