如何在 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 问题和解决方法。
目前我只能运行来自包含目录的脚本,因为 shebang 行包含相对于当前目录的路径
#!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline
如何将"."
修改为绝对路径?
./Rome/
到可以在任何目录下工作的东西?我试过以下方法:
[=13=]/Rome/
无效
dirname [=14=]
/罗马/不工作
/Rome/
无效
#!/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 问题和解决方法。