2017-07-21 82 views
5

Czy wiesz, że większość shebang implementacje wesprze jeden parametr, więc jeśli masz coś takiegoJak oszukać shebang, aby umożliwić wiele parametrów?

#!/usr/bin/env some-tool-accepting-yaml param1 param2 
... (yaml body) 

Będzie teraz działać zgodnie z oczekiwaniami, ponieważ będzie to wywołać narzędzie z „param1 param2” argumentu zamiast dzieląc go na dwa argumenty.

Wydaje się, że jeden workaround praktyką jest użyć czegoś takiego:

#!/bin/sh 
arbitrary_long_name==0 "exec" "/usr/bin/gawk" "--re-interval" "-f" "$0" "[email protected]" 

Teraz to podejście pozwoliłoby skrypt YAML oparte nieważny ze względu na 2 linii, więc jedynym akceptowalnym Rozwiązaniem byłby taki, który jest również komentarz, zaczynając od "#".

Czy istnieje sposób na obejście tego problemu?

+1

który jest wykonywalny, aby uruchomić to jest 'python'? ponieważ istnieje również podobne pytanie: https://stackoverflow.com/questions/17458528/why-does-this-snippet-with-a-shebang-bin-sh-and-exec-python-inside-4-single-q –

+0

Rozwiązanie, które cytujesz, dotyczy awk, a nie pytona. – rici

+2

Czy interesuje cię obejście problemu dla YAML, czy ogólne rozwiązanie? W pierwszym przypadku, powiedz nam, co plik wykonywalny powinien ostatecznie pochłonąć zawartość pliku? – randomir

Odpowiedz

3

ogólne rozwiązanie bez użycia skryptów poliglota

launcher.sh

#!/bin/bash 

# first argument to be split 
if [[ $- != *f* ]]; then reset=1; fi 
set -f 
arg=($1) 
shift 
if [[ $reset = 1 ]]; then set +f; fi 

# other arguments 
arg+=("[email protected]") 

# launch command 
exec "${arg[@]}" 

skrypt

#!/path/to/launcher.sh interpreter opts 
+0

Dzięki, ale nadal szukam samodzielnego rozwiązania, jeśli to nawet możliwe. – sorin