pm-suspend vs systemctl suspend?

Сегодня вы обычно можете найти в системе оболочку POSIX, и это обычно означает, что вы можете создавать сценарии на языке POSIX (по модулю, обнаруживающему ошибки соответствия).

Единственная проблема заключается в том, что / bin / sh иногда не является оболочкой POSIX. И вы должны жестко запрограммировать #! строка в скриптах, которые должны вести себя как хорошие исполняемые файлы; вы не можете просто попросить пользователя исследовать проблему, а затем вызвать ваш скрипт как / path / to / posix / shell myscript .

Итак, уловка состоит в том, чтобы использовать в вашем скрипте возможности POSIX, но заставить скрипт автоматически находить оболочку POSIX. Один из способов сделать это так:

#!/bin/sh

# At this point, we may be running under some old shell
# we have to tread carefully.

# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".

if ! test x$posix_shell = x ; then
  # the three possible shell paths are just an example;
  # please extend as necessary.

  for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
    if test -x $shell ; then
       posix_shell=$shell
    fi
  done
  if test x$posix_shell = x ; then
    echo "no POSIX shell found"
    exit 1
    # or we could avoid bailing here and just fall back on /bin/sh:
    # echo "falling back on /bin/sh: cross your fingers that it works"
    # posix_shell=/bin/sh
  fi
  export posix_shell

  # plain "$@" is broken in ancient shells! 
  # I seem to recall ${@+"$@"}: not sure if that's the right trick.

  exec $posix_shell $0 ${@+"$@"}  # can we count on exec in legacy shells? 
fi

# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.

Есть и другие подходы, такие как генерация кода. Усовершенствуйте свои скрипты с помощью небольшого скрипта, который принимает тело файлов скриптов без символа #! линия и добавляет единицу.

Худшее, что вы можете сделать, - это начать писать целые сценарии таким образом, чтобы они работали в оболочке Bourne с 1981 года. Это необходимо только в том случае, если вы должны писать для системы, в которой на самом деле нет любая другая оболочка.

9
30.11.2018, 04:17
0 ответов

Теги

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