我制作了一个shell脚本,该脚本接收一个球拍文件作为参数,并使用它来运行以下命令来执行该文件并保持交互模式。
racket -i -e '(enter! "filename.rkt")'
问题是,当我运行脚本时,上面的命令在执行时没有最后的单引号,这会生成错误消息。
我尝试在命令的末尾(在脚本内)放置更多字符,以查看它是否只是忽略了最后一个字符,但这没有用。
这是我的剧本:
# rkt.sh
if [ "$#" -ne 1 ]; then
echo "Not enough parameters!"
else
option=\''(enter! "'$1'")'\'
racket -i -e "$path"
fi
运行命令后:
rkt test.rkt
这是球拍程序显示的错误:
Welcome to Racket v7.0.
'(enter! "test.rkt")
string::21: read-syntax: expected an element for quoting "'", found end-of-file
context...:
reader-error12
read-undotted
read-syntax
但是当我回显脚本的变量选项时,它会显示所需的结果:
'(enter! "test.rkt")'
答案 0 :(得分:1)
Scheme实现中的单引号和Racket之类的后代用于文字数据,您无需将它们配对。
出现错误消息是因为它已读取'(enter! "test.rkt")
并将其评估为(enter! "test.rkt")
,尽管您具有标准的球拍打印模式,该模式不显示tha值,而是一个可以评估该值的值。因此'(enter! "test.rkt")
。此后,它已读取'
,但数据并未在那里得到报价。 'x
有效'
无效。
我猜这就是您想要的:
#/bin/sh
if [ "$#" -ne 1 ]; then
echo "Not enough parameters!"
else
option="(enter! \"$1\")"
racket -i -e "$option"
fi
虽然可以加载该文件,但它可能创建的定义似乎不可用。因此,在完成其操作后处于交互模式不会提供太多功能。
答案 1 :(得分:0)
这是一种写我认为在球拍中要记住的内容的方法,而无需经过Bash。只需chmod +x
个文件即可。
#!/usr/bin/env racket
#lang racket/base
(require racket/cmdline)
(define file
(command-line
#:usage-help "start a Racket REPL inside the module <file>"
#:args (file)
file))
(void (write-string (banner)))
(define ns (make-base-namespace))
(parameterize ([current-namespace ns])
(eval '(require racket/init racket/interactive))
(eval `(enter! ,file))
(read-eval-print-loop))