#!/usr/bin/env Аргументы Интерпретатора — портативные сценарии с аргументами в пользу интерпретатора

Поскольку интерпретаторы, такие как zsh, удар, Python, жемчуг может быть расположен в различных местах в файловой системе, сценарии часто имеют хижину, которая использует env для мобильности, например. #!/usr/bin/env zsh. Однако как http://en.wikipedia.org/wiki/Shebang_ (Unix), который объясняет #Portability, много систем включая Linux не позволяют передачу аргументов интерпретатору.

Часто, я хотел бы сделать что-то как #!/usr/bin/env zsh -f предотвратить мой сценарий, чтобы когда-либо считать мой ~/.zshenv, или я хотел бы сделать #!/usr/bin/env perl -w, и т.д. Это работает над OS X, но не над Linux.

Каково обходное решение для этого? Могу я иметь лучший из обоих миров: мобильность и аргументы в пользу интерпретатора? Если возможно, дайте общее обходное решение, которое работает на все интерпретаторы, не просто zsh.

7
задан 09.05.2011, 07:28

0 ответов

Вот встроенное решение работать вокруг проблемы мобильности на ZSH.

#! /bin/sh

if [ -z "$IN_ZSH" ]; then
  export IN_ZSH=1
  exec zsh -f "$0" "$@"
fi

## Your ZSH script here

Некоторые другие методы для попытки включают

  • Передающие огибающие переменные через/usr/bin/env, которые изменяют поведение то же как --options такой как выполнение
    #! /usr/bin/env POSIXLY_CORRECT=1 bash
  • Используя умные приемы комментария, такой как, как этот сценарий начинает использовать SH, но вызывает TCL на тот же сценарий
    #! /bin/sh
    # \
    TCLBIN=/usr/bin/tclsh; \
    exec $TCLBIN "$0" "$@"
    # Execute the rest via tclsh
    set argc
  • Установка опции однажды в интерпретаторе, если --options быть переданным в не влияет на поведение загрузки
    #! /usr/bin/env bash
    # Exit if any error detected
    set -e
  • Для жемчуга, если Вы можете использовать более новые версии, это может работать вместо-w:
    #! /usr/bin/env perl
    use warnings;
  • Используя начальную загрузку invoke.sh сценарий вместо/usr/bin/env для использования ПУТИ, звонящего с /path/to/invoke.sh script с Вашим сценарием, запускающимся с #! zsh -f
    #! /bin/sh

    SCRIPT=$1
    shift 1
    cmd=`sed -n -e 's:#! \?::' -e '1p' $SCRIPT`
    exec $cmd $SCRIPT
6
ответ дан 07.12.2019, 15:04

Теги

Похожие вопросы