1

如果我想在软件集合下运行特定命令(带参数),我可以使用这个命令:

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!

我究竟做错了什么?

4

2 回答 2

2

您应该尝试使用--而不是用引号括起您的命令。

scl enable python27 -- ls /tmp

我能够使用这个shebang制作一个使用rh-python35集合的python脚本:

#!/usr/bin/scl enable rh-python35 -- python

import sys
print(sys.version)
于 2020-04-23T19:16:51.587 回答
1

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 ...手动输入了。

于 2019-10-04T23:14:43.523 回答