如果我想在软件集合下运行一个特定的命令(带有参数),我可以使用以下命令:
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!我做错了什么?
发布于 2019-10-04 23:14:43
在she bang命令中对参数的解析并没有真正定义。来自man execve
解释器脚本的可选arg参数的语义因实现而异。在Linux上,解释器名称后面的整个字符串作为一个参数传递给解释器,这个字符串可以包含空格。然而,在其他一些系统上,行为是不同的。有些系统使用第一个空白来终止可选的-arg。在某些系统中,解释器脚本可以有多个参数,可选-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"'这将失败,因为它将无法找到用于scl的名为enable python27 "ls /tmp"的命令来执行。
有几个解决办法你可以用。
您可以通过scl调用您的脚本:
$ cat myscript
#!/bin/bash
echo hello
$ scl enable python27 ./myscript
hello您也可以使用特雷多表示法,但它可能会导致微妙的问题。我个人避免这样做:
$ 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 ...。
发布于 2020-04-23 19:16:51
您应该尝试使用--,而不是在命令周围加上引号。
scl enable python27 -- ls /tmp
我能够制作一个python脚本,它使用这个shebang使用rh-python 35集合:
#!/usr/bin/scl enable rh-python35 -- python
import sys
print(sys.version)https://stackoverflow.com/questions/58208150
复制相似问题