【问题标题】:How to get the directory path of a script in the shebang line如何在shebang行中获取脚本的目录路径
【发布时间】:2016-07-10 10:23:58
【问题描述】:

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

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

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

./Rome/ 到任何目录都可以使用的东西?我尝试了以下方法:

$0/Rome/ 不起作用

dirname $0 /Rome/ 不起作用

$1/Rome/ 不起作用

【问题讨论】:

    标签: bash shell unix shebang


    【解决方案1】:

    #!/usr/bin/env xcrun swift -F ./Rome/ -framework Swiftline 无法工作,因为 shebang 线路的工作方式。 shebang 行上第一个空格之后的所有内容都被视为一个参数。在这种情况下,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
    

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

    【讨论】:

    • 创建一个普通的run.sh,它只会启动xcrun swift -F etc.,shebang 的功能不够强大,供您使用
    • 是的。不得不添加一个包装器。谢谢
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2022-12-14
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多