如何在shebang行中获取脚本的目录路径

时间:2016-07-10 10:23:58

标签: bash shell unix shebang

目前我只能从包含目录运行一个脚本,因为shebang行包含一个相对于当前目录的路径

from operator import itemgetter

l = ['a', 'b', 'c', 'd', 'e']
l_ids = [1, 2, 3]
list(itemgetter(*l_ids)(l))

如何将#!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline 修改为绝对路径?

"."可以在任何目录中使用吗?我尝试了以下内容:

./Rome/不起作用

$0/Rome/ /罗马/不起作用

dirname $0不起作用

2 个答案:

答案 0 :(得分:1)

由于shebang线的工作方式,

#!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline无效。在shebang线上第一个空格之后的所有东西都被视为一个参数。在这种情况下,env将作为第一个参数传递“xcrun swift -F ./Rome/-framework Swiftline”,并将包含此shebang的文件名作为第二个参数传递,由于xcrun swift -F ./Rome/ -framework Swiftline不是文件,因此无效。< / p>

您可以通过制作一个只打印其参数的假解释器轻松地看到这一点,例如/tmp/run.sh包含:

#!/bin/sh
printf "%s\n" "$@"

然后在脚本/tmp/foo.sh中使用此解释器:

#!/tmp/run.sh -a -b -c
exit

运行foo.sh时,您将看到传递给解释器的参数:

-a -b -c
./foo.sh

除了文件之外,您还必须提供运行xcrun内容的普通shell脚本。 shebang不适合你的情况。

答案 1 :(得分:0)

当PyCharm在项目文件夹中创建虚拟环境venv并在完整路径中带有空格时,我遇到了这样的问题。对于这种情况,有一个简单的解决方法-我将项目移至无空间的位置,然后在此处重新创建venv。现在,shebang路径中的所有文件都包含指向新位置的绝对路径,并且一切正常。

为完成解决方法,我创建了一个符号链接,该符号链接返回到项目文件夹的原始位置。现在我在那里有一个可操作的pip,等等。

这不是最好的解决方案,但是我可以按照需要的方式在原始位置工作,将辅助废话放在一个位置:-)。当然,这也是纯Pythonic问题和解决方法。