【问题标题】:Common Lisp Shebang Script Gives "Command Not Found"Common Lisp Shebang 脚本给出“找不到命令”
【发布时间】:2020-01-26 09:26:39
【问题描述】:

我很想在 MacOS 上使用 SBCL 运行 Common Lisp shebang 脚本 (test.lisp)。脚本如下:

#!/usr/local/bin/Cellar/sbcl/1.5.6/bin/sbcl --script
(write-line "test")

我在脚本上运行 chmod +x 以使其可执行,当我运行它时,我得到:

./test.lisp: line 2: write-line: command not found

我确定我的 SBCL 路径是正确的。我最初尝试了 /usr/local/bin/sbcl,但是这给了我同样的错误。

我该如何解决这个问题?

【问题讨论】:

  • 将这样一个特定路径放入 shebang 是一个非常糟糕的主意,因为版本 1.5.6 将得到更新并且该命令将失败,因此您最好使用 #!/usr/bin/env sbcl 并且您可能不会t需要--script(不确定——对lisp一无所知)。当你运行/usr/bin/local/Cellar/sbcl/1.5.6/bin/sbcl --script test.lisp 时会发生什么?如果你得到相同的效果,那么这不是一个shebang问题。
  • 使用 #!/usr/bin/env sbcl --script 有效!我确实需要 --script,或者它只是把我扔进了 SBCL repl。非常感谢
  • 我想你还是把/usr/local/bin/usr/bin/local 搞混了。
  • 这只是帖子中的一个错字,谢谢指出

标签: macos common-lisp sbcl shebang


【解决方案1】:

请勿在 shebang 脚本行中使用此类特定路径,尤其是当它们包含版本号时,因为这些二进制文件的位置/版本可能会更改并破坏脚本。

改为使用/usr/bin/env 来查找可执行文件,在您的情况下是:

#!/usr/bin/env sbcl --script

【讨论】:

  • 我意识到这个问题被标记为 MacOS,但为了完整起见,请注意这个解决方案目前不适用于许多(大多数?)Linux 发行版。 SBCL 需要 --script 参数,但 coreutils only gained the ability to handle passing multiple arguments to env (via the -S flag) in version 8.30。例如,Ubuntu 18.04 目前是 8.28 版。
  • @AnOccasionalCashew 答案的重点是从使用脚本解释器的特定路径转向使用/usr/bin/env,与SBCL(不管是什么)无关。
  • 您的答案在 MacOS 上有效,但在目前许多 Linux 发行版上将无效。在这种情况下,SBCL 是用于运行脚本的特定 Common Lisp 实现。这很重要,因为 SBCL 特别要求传递--script 参数,但当前常用的env 版本无法处理多个参数。我非常感谢您的总体意图,以及这不适用于 MacOS。请注意,不幸的是,这些脚本暂时无法移植到许多 Linux 机器上。
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多