Como posso encaminhar #! através de um script bash para fornecer indireção

1

Desculpe se a declaração da pergunta não foi muito clara.

Eu gostaria de ter um script bash que eu possa editar para alterar o comportamento de vários outros scripts.

Por exemplo - eu tenho alguns scripts interessantes. eles podem ser executados com o groovy intérprete "groovy" ou com um corredor especial chamado "groovyclient". Eu poderia querer mudar o que é executado (ou fazer algo completamente diferente, como compilá-los em arquivos de classe Java e executá-los com Java)

Então, se eu tiver um script indireto: / home / me / groovy / groovyrun, que é um script de shell, pode ser assim:

/usr/bin/groovy %*

ou assim:

/home/me/groovy/groovyclient $*

Eu tentei um #! linha nos scripts originais que se parece com isso:

#!/home/me/groovy/groovyrun

e rapidamente percebeu que o bash não estava sendo invocado, então não tinha ideia do que fazer com o groovyrun

Eu então tentei:

#!/bin/bash /home/me/groovy/groovyrun

Mas agora acho que o $ *

Isso deve ser executado, mas acredito que tenha problemas para acessar a lista de argumentos original (o $ * no script chamado provavelmente está errado).

Agora estou bastante perdido em relação a como fazer isso e acho que é provavelmente um padrão comum e eu não estou familiarizado o suficiente com o Linux para conhecê-lo (ou até mesmo como encontrá-lo), então eu pergunto .

Eu poderia facilmente resolvê-lo se eu renunciar ao #! completamente e apenas passar o script groovy para um script de shell diretamente, mas o que é divertido?

    
por Bill K 27.04.2016 / 19:27

2 respostas

0

Ele deve funcionar se você especificar o shebang no script groovyrun .

Como uma experiência rápida, crie shell1 contendo

#!/bin/sh
echo shell1: "$@"
sh "$@"

e shell2 contendo

#!/.../shell1
echo shell2: "$@"

(com o caminho correto para shell1 ); executando shell2 Hello , em seguida, produz

shell1: ./shell2 Hello
shell2: Hello

Como você pode ver, os parâmetros passados para cada script parecem corretos nos dois casos.

    
por 27.04.2016 / 19:37
2

Se eu entendi corretamente, você quer criar um nível de indireção, onde o programa que você especificar através de um shebang em um script é em si um script com um shebang. O Linux aceita shebangs aninhados, mas outras variantes Unix não . Então você pode colocar

#!/home/me/groovy/groovyrun

na parte superior dos seus scripts do Groovy e

#!/bin/sh

na parte superior de /home/me/groovy/groovyrun .

Para executar groovyclient ou groovy do script wrapper, use algo como

#!/bin/sh
if …; then
  exec groovyclient "$@"
else
  exec groovy "$@"
fi

"$@" representa a lista de parâmetros passados para o script, copiados exatamente como estão (preservando corretamente os espaços e assim por diante nos argumentos). Não use $* , que concatena os argumentos com espaços intermediários (para que groovyrun 'foo bar' se degenere em groovyrun 'foo' 'bar' ) e nunca deixe uma expansão variável sem aspas . Em relação a exec , consulte motivo para exec em scripts de wrapper

    
por 29.04.2016 / 01:49

Tags