【问题标题】:How to detect script file vs executable in custom shell如何在自定义外壳中检测脚本文件与可执行文件
【发布时间】: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 作为默认值,我可以将内核在这方面的行为更改为我的默认值吗?

标签: c++ shell unix cygwin


【解决方案1】:

“文件”命令可以帮助您识别要检查的“文件”类型

一些例子:

$file lavtc.sh
lavtc.sh: POSIX shell script, ASCII text executable, with very long lines

还有:

$file java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x5cb4cd120c014a335b60544ef209526e8a86f34c, stripped

【讨论】:

  • 嗯...我可能需要将内部file 命令的输出重定向到一个变量以进行解析...假设脚本文件至少大部分内容是正确的时间说“ASCII文本”?
  • 好吧,shell 脚本也应该这样做。 ...您也可以直接分配(不使用文件):AVAR=file myfile.sh(注意符号`)
  • 嗯,这个想法是为了规避 bash。我相信file 是 PATH 中的一个应用程序。如果我将它的输出重定向到一个 cstring,我应该能够解析我的源代码。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多