Node.js 执行JS中未解析参数的Node/bash/(fish)脚本
我试图编写一个node命令,它只计算并输出参数中传递的代码。理想情况下,我不必先将它们用引号括起来或放入文件中。如果节点/bash脚本被称为Node.js 执行JS中未解析参数的Node/bash/(fish)脚本,node.js,bash,command-line-arguments,fish,Node.js,Bash,Command Line Arguments,Fish,我试图编写一个node命令,它只计算并输出参数中传递的代码。理想情况下,我不必先将它们用引号括起来或放入文件中。如果节点/bash脚本被称为n,并且位于路径中,则我希望这样做: $ n 1 + "1" 11 我试图通过简单地用空格连接所有shell参数来实现这一点,但是上面的例子失败了,因为参数是[“1”、“+”、“1”],因为双引号是定义参数的shell语法的一部分。这意味着我得到的是: $ n 1 + "1" 2 下面是我在这两个节点中的尝试 #!/usr/bin/node consol
n
,并且位于路径中,则我希望这样做:
$ n 1 + "1"
11
我试图通过简单地用空格连接所有shell参数来实现这一点,但是上面的例子失败了,因为参数是[“1”、“+”、“1”]
,因为双引号是定义参数的shell语法的一部分。这意味着我得到的是:
$ n 1 + "1"
2
下面是我在这两个节点中的尝试
#!/usr/bin/node
console.log(eval(process.argv.slice(2).join(' ')))
痛击
#!/bin/bash
node -e "console.log(eval(\"$*\"))"
后来我试着从另一个角度到达那里:我知道ps
存储完整的命令,我认为它不会以任何方式解析它。这就是为什么我认为如果不添加一些奇怪的内部挂钩,就不可能做到这一点。因此,我编写了一个节点脚本,以在当前pid下输出ps存储的命令:
#!/usr/bin/node
require('child_process').exec(`ps ${process.pid}`, (err, stdout) => {
const [ headers, process ] = stdout.split('\n');
const commandIndex = headers.indexOf('COMMAND');
const command = process.substring(commandIndex).split(' ').slice(2).join(' ');
console.log(command);
})
不幸的是,ps
还存储解析后的输入:
$ n 1 + "1"
1 + 1
我本以为bash会有一个带有unparsed current命令的环境变量,但我找不到它
实际上,我正在使用来实际运行该命令,这可能会带来一些好处,但我意识到关于鱼的问题可能对很多人都没有用处
也许有一种方法可以从节点内获取这些参数?我可能遗漏了一个隐藏的环境变量?我如何创建一个$n1+“1”
来区分带引号和不带引号的参数,从而输出11
包装或转义是不可接受的解决方法
我如何创建一个$n1+“1”来区分带引号的参数和不带引号的参数,从而输出11
你没有。shell脚本的一个基本思想(适用于fish和bash)是,shell处理您的参数,然后将它们传递给程序
这不仅适用于引号(使用引号时,例如,“带空格的文件”
作为一个参数传递,或者“$var”
不进行变量扩展),还适用于*
(进行全局搜索)和$
(根据shell进行一系列扩展)
除非你特别想依赖一个特定的shell来运行你的程序(你可能没有),否则没有办法关闭它
一种可能的解决方法是将您的工具用作REPL,这样用户将调用n
,然后键入表达式
另一种方法是将整个表达式作为一个参数,这样用户就可以使用
n '1 + "1"'
您将以1+“1”
的形式收到
我还认为你对这个问题有点高估了。如果您使用的是shell,通常需要执行这种转义,如果您的工具突然没有它,它实际上会更加混乱,而不是更少。
1
和“1”
都产生完全相同的单词;shell在将参数传递给n
之前,先去掉引号。最好从一个引用的参数开始,代表整个表达式,而不是让n
从多个参数中拼凑出一个表达式。@chepnerI问这个问题正是因为我想避免那样为什么?说“我的脚本接受以下格式的表达式:…”,然后将其作为单引号字符串传递比让脚本依赖于用于调用脚本的任何shell的特定语义要简单得多。