【问题标题】:Shell script change shell in betweenShell脚本在两者之间更改shell
【发布时间】:2012-01-28 08:26:24
【问题描述】:

我有一个带有两个 shebang 的 shell 脚本,第一个告诉 #!/bin/sh,几行之后另一个是 #!/usr/bin/env python。

当此脚本被授予可执行权限并以 ./script.sh 运行时,该脚本工作正常,在第一部分使用 /bin/sh,在后部分使用 python 解释器。

但是当脚本以 sh script.sh 运行时,第二个 shebang 无法识别,脚本失败。如果脚本作为 sh script.sh 显式运行,我是否可以强制更改解释器。

我需要这个的原因是因为我需要通过一个作为 sh script.sh 运行的工具来运行脚本

【问题讨论】:

  • 显示您的脚本以获得真正的帮助。
  • @Basile Starynkevitch 我实际上需要运行 python ,但是该工具只运行 sh script.sh 的 shell 脚本,所以我需要将解释器更改为 python
  • 如果您以sh script.sh 运行它,则所有shebangs 都会被忽略。无论如何,第二个都被忽略了——内核只查看第一个。

标签: python shell shebang


【解决方案1】:

更好的方法是使用 shell here document。像这样的:

#!/bin/sh
curdir=`pwd`
/usr/bin/env python <<EOF
import os
print os.listdir("$curdir")
EOF

这样,您无需将代码分布在两个单独的文件中。

如您所见,您甚至可以从 python 代码中访问 shell 变量。

【讨论】:

    【解决方案2】:

    据我所知,一个脚本中不能有两条 shebang 行。 shebang 仅在以下情况下有效 -

    1. 在第一行
    2. 从第一列开始

    如果您需要运行 python 代码,则将其放在另一个脚本中,然后通过执行调用该脚本

    python path/to/the/script.py
    

    【讨论】:

      【解决方案3】:

      让您的 script.sh 脚本直接调用 python 解释器:

      #!/bin/sh
      # include full path if needed
      python (your python interpreter arguments)
      

      【讨论】:

        相关资源