Как использовать команду scl в качестве сценария shebang? - PullRequest
0 голосов
/ 02 октября 2019

Если я хочу выполнить определенную команду (с аргументами) в разделе «Коллекции программного обеспечения», я могу использовать эту команду:

scl enable python27 "ls /tmp"

Однако, если я попытаюсь создать сценарий оболочки, который имеет команду, аналогичнуюя получаю ошибки:

$ cat myscript
#!/usr/bin/scl enable python27 "ls /tmp"
echo hello

$ ./myscript
Unable to open /etc/scl/prefixes/"ls!

Что я делаю не так?

1 Ответ

1 голос
/ 05 октября 2019

Разбор аргументов в команде 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 ... вручную.

...