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

How to get the directory path of a script in the shebang line

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

#!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline

如何将"."修改为绝对路径?

./Rome/ 到可以在任何目录下工作的东西?我试过以下方法:

[=13=]/Rome/ 无效

dirname [=14=]/罗马/不工作

/Rome/ 无效

由于 shebang 行的工作方式,

#!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline 将无法工作。 shebang 行中第一个 space 之后的所有内容都被视为单个参数。在这种情况下,env 将作为第一个参数传递 "xcrun swift -F ./Rome/ -framework Swiftline",并将包含此 shebang 的文件名作为第二个参数传递,这将不起作用,因为 xcrun swift -F ./Rome/ -framework Swiftline 不是文件。

你可以很容易地看到,通过制作一个只打印其参数的假解释器,例如 /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

除了您的文件之外,您还必须提供一个正常的 shell 脚本来运行 xcrun 内容。 shebang 不适用于您的情况。

当 PyCharm 在项目文件夹中创建一个虚拟环境 venv 并且完整路径为 space 时,我遇到了这样的问题。对于这种情况,有一个简单的解决方法 - 我将项目移动到 space-free 位置并在那里重新创建 venv。 shebang 路径中​​的所有文件现在都包含到新位置的绝对路径,并且一切正常。

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

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