如果我想在软件集合下运行特定命令(带参数),我可以使用这个命令:
scl enable python27 "ls /tmp"
但是,如果我尝试制作一个与 shebang 行具有类似命令的 shell 脚本,则会出现错误:
$ cat myscript
#!/usr/bin/scl enable python27 "ls /tmp"
echo hello
$ ./myscript
Unable to open /etc/scl/prefixes/"ls!
我究竟做错了什么?
如果我想在软件集合下运行特定命令(带参数),我可以使用这个命令:
scl enable python27 "ls /tmp"
但是,如果我尝试制作一个与 shebang 行具有类似命令的 shell 脚本,则会出现错误:
$ cat myscript
#!/usr/bin/scl enable python27 "ls /tmp"
echo hello
$ ./myscript
Unable to open /etc/scl/prefixes/"ls!
我究竟做错了什么?
您应该尝试使用--
而不是用引号括起您的命令。
scl enable python27 -- ls /tmp
我能够使用这个shebang制作一个使用rh-python35集合的python脚本:
#!/usr/bin/scl enable rh-python35 -- python
import sys
print(sys.version)
she-bang 命令中的参数解析并没有真正定义。来自man execve
:
解释器脚本的 optional-arg 参数的语义因实现而异。在 Linux 上,解释器名称后面的整个字符串作为单个参数传递给解释器,并且该字符串可以包含空格。但是,在其他一些系统上的行为有所不同。一些系统使用第一个空格来终止 optional-arg。在某些系统上,解释器脚本可以有多个参数,并且 optional-arg 中的空格用于分隔参数。
无论如何,不支持基于引号 sis 的参数拆分。所以当你写:
#!/usr/bin/scl enable python27 "ls /tmp"
很可能被调用的是(使用 bash 表示法):
'/usr/bin/scl' 'enable' 'python27' '"ls' '/tmp"'
这可能是它尝试在以下位置打开"ls
文件的原因/etc/scl/prefixes/"ls
但是,shebang 评估为:
'/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 ...
手动输入了。