【发布时间】:2013-03-01 06:48:00
【问题描述】:
堆栈溢出!对于系统编程课程,我构建了一个自定义 shell,自作业结束以来我一直在对其进行调整,目的是希望取代 bash 和批处理作为我的主要脚本语言。在 Cygwin 中用 C++ 完成,使用 unistd.h 进行管道、分叉等。无论如何,我遇到的一个问题是,在运行我的 shell 时,虽然可执行文件被识别为这样并使用 exec(3) 函数运行,但文本文件(作为脚本运行)被传回 bash 执行。显而易见的答案是把#!每个脚本中的标头都重定向到我的 shell,但我想在其中打开脚本时将我的 shell 作为默认值运行。
在一个稍微相关的注释中,告诉我是否应该单独询问这个问题,但我希望能够在不事先启动 bash 的情况下运行我的 shell。但是,我相信 Cygwin 通过运行 bash --login -i 来启动 UNIX 环境(我的 shell 所必需的)
在批处理文件中。是否有不涉及运行 Linux(VM 或其他)的可能解决方法?
【问题讨论】:
-
shebang 行 (
#!...) 由内核解释,而不是由 shell。我不认为它是可选的,或者至少将其排除在外是不可移植的。用于解释脚本的 shell 不应依赖于运行它的 shell。 -
最简单的方法是将你的 shell 命名为
cygwin\bin\bash.exe- 即用你的 shell 替换默认的 bash。我不知道 Cygwin 如何处理#!,但是当它指定/bin/bash时,它可能需要自定义cygwin.dll来覆盖 shell 处理程序 -
我的机器使用 bash 作为默认的脚本解释器。我意识到一直使用 shebang 是一种很好的做法,但是为了我的 shell 作为默认值,我可以将内核在这方面的行为更改为我的默认值吗?