Разбор аргументов в команде she-bang на самом деле не определен. От man execve
:
Семантика аргумента необязательного аргумента сценария интерпретатора варьируется в зависимости от реализации. В Linux вся строка, следующая за именем интерпретатора, передается интерпретатору как один аргумент, и эта строка может содержать пробелы. Тем не менее, поведение отличается в некоторых других системах. Некоторые системы используют первый пробел для завершения option-arg. В некоторых системах сценарий интерпретатора может иметь несколько аргументов, а пробел в option-arg используется для разделения аргументов.
Независимо от того, что разделение аргументов на основе кавычек не поддерживается. Поэтому, когда вы пишете:
#!/usr/bin/scl enable python27 "ls /tmp"
Вполне возможно, что вызывается (с использованием bash-записи):
'/usr/bin/scl' 'enable' 'python27' '"ls' '/tmp"'
Возможно, именно поэтому он пытается открыть файл "ls
в /etc/scl/prefixes/"ls
Но вполне вероятно, что шебанг оценивается как:
'/usr/bin/scl' 'enable python27 "ls /tmp"'
И это не получится, так как он не сможет найти команду с именем enable python27 "ls /tmp"
для sclдля выполнения.
Есть несколько обходных путей, которые вы можете использовать.
Вы можете вызвать свой скрипт с помощью scl:
$ cat myscript
#!/bin/bash
echo hello
$ scl enable python27 ./myscript
hello
Вы также можете использовать heredoc , но это может привести к тонким проблемам. Я лично избегаю этого:
$ cat ./myscript
#!/bin/bash
scl enable python27 -- <<EOF
echo hi
echo \$X_SCLS
EOF
$ bash -x myscript
+ scl enable python27 --
hi
python27
Вы можете увидеть один из уже полученных ошибок: мне пришлось написать \$X_SCLS
, чтобы получить доступ к переменной окружения вместо просто $X_SCL
.
Редактировать:Другой вариант - два сценария. Тот, который имеет реальный код, а второй, который просто делает scl enable python27 $FIRST_SCRIPT
. Тогда вам не нужно будет вводить scl ...
вручную.