Строка shebang интерпретируется ядром и не очень гибкая. В Linux он ограничен одним аргументом: синтаксис #!
, необязательный пробел, путь к интерпретатору (не содержащий пробелов), необязательный пробел и, возможно, один аргумент (который может содержать пробелы, за исключением начала). Кроме того, общий размер строки shebang ограничен 128 байтами ( BINPRM_BUF_SIZE
константа в исходниках ядра, используемая в load_script
).
Если вы хотите передать более одного аргумента, вам нужен обходной путь. Если вы используете #!/usr/bin/env
для расширения пути, то есть место только для имени команды и никаких других аргументов.
Самый очевидный обходной путь — скрипт-оболочка. Вместо того, чтобы /path/to/my-script
содержал код mocha, вы помещаете код mocha в какой-то другой файл /path/to/my-script.real
и делаете /path/to/my-script
небольшой сценарий оболочки.Вот пример оболочки, в которой предполагается, что реальный код находится в файле с тем же именем, что и скрипт, плюс .real
в конце.
#!/bin/sh
exec mocha --reporter=tap --output=foo "$0.real" "$@"
С оболочкой оболочки вы можете воспользоваться возможностью делать более сложные вещи, такие как определение переменных среды, поиск доступных версий интерпретатора и т. д.
Использование exec
перед интерпретатором гарантирует, что script будет выполняться в том же процессе, что и оболочка оболочки. Без exec
, в зависимости от оболочки, он может работать как подпроцесс, что имеет значение, например. если вы хотите посылать сигналы сценарию.
Иногда скрипт-оболочка и фактический код могут находиться в одном файле, если вам удастся написать полиглот — файл, содержащий допустимый код на двух разных языках. Написание полиглотов не всегда легко (или даже возможно), но это имеет то преимущество, что не нужно управлять двумя отдельными файлами и развертывать их. Вот полиглот JavaScript/shell, где часть оболочки выполняет интерпретатор JS в файле (при условии, что интерпретатор JS игнорирует строку shebang, вы мало что можете сделать, если это не так):
#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …
У меня была та же проблема при использовании конфигурации, импортированной с предыдущего компьютера.
Вот как я решил эту проблему:
$ sudo rm -v /var/lib/postfix/master.lock
$ sudo systemctl start postfix
В моем случае также были проблемы с процессом постфикса, оставшимся от предыдущих попыток, вот решение:
- проверьте, что постфикс не запущен:
$ ps faxu | grep -i [p]ostfix
root 12854 0.0 0.2 92004 2236 ? Ss 07:23 0:00 /usr/libexec/postfix/master -w
postfix 12855 0.0 0.4 98320 4088 ? S 07:23 0:00 \_ pickup -l -t fifo -u
postfix 12856 0.0 0.4 98388 4128 ? S 07:23 0:00 \_ qmgr -l -t fifo -u
postfix 12872 0.0 0.4 98332 4672 ? S 07:29 0:00 \_ tlsmgr -l -t unix -u
- Если у вас запущены постфиксные процессы, уничтожьте их все:
$ sudo kill -9 12854 12855 12856 12872
- после уничтожения всех процессов удалите файл master.lock и запустите постфикс с помощью systemctl (см. Выше).
Наконец, не забывайте, что каталог queue_directory должен указывать на / var / spool / postfix ...