7

Поскольку такие интерпретаторы, как zsh, bash, python, perl, могут находиться в разных местах файловой системы, сценарии часто имеют шебанг, который использует 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.

1 ответ1

6

Вот встроенное решение, чтобы обойти проблему переносимости для ZSH.

#! /bin/sh

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

## Your ZSH script here

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

  • Передача переменных env через /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
  • Для perl, если вы можете использовать более новые версии, это может работать вместо -w:
    #! /usr/bin/env perl
    use warnings;
  • Использование загрузочного скрипта invoke.sh вместо /usr /bin /env для использования вашего PATH, вызов с /path/to/invoke.sh script где ваш скрипт начинается с #! zsh -f
    #! /bin/sh

    SCRIPT=$1
    shift 1
    cmd=`sed -n -e 's:#! \?::' -e '1p' $SCRIPT`
    exec $cmd $SCRIPT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .