我试图编写一个节点命令,它只是评估并输出参数中传递的代码。理想情况下,我不必将它们包装在引号中或首先将它们放在文件中。如果节点/ bash脚本被调用n
并且在路径中,那么这就是我想要发生的事情:
$ n 1 + "1"
11
我试图通过简单地用空格连接所有shell参数来实现这一点,但上面的情况失败了,因为参数是["1", "+", "1"]
,因为双引号是用于定义参数的shell语法的一部分。这意味着我得到的是:
$ n 1 + "1"
2
以下是我在两个节点中的尝试
#!/usr/bin/node
console.log(eval(process.argv.slice(2).join(' ')))
和bash
#!/bin/bash
node -e "console.log(eval(\"$*\"))"
我试着从另一个角度来到那里:我知道ps <pid>
存储了完整的命令,我认为它不会以任何方式解析它。这就是为什么我认为如果不添加一些奇怪的内部钩子就不可能做到这一点。所以我写了一个节点脚本来输出当前pid的ps-stored命令:
#!/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会有一个带有未解析的当前命令的环境变量,但是我找不到它。
我实际上使用fish来实际运行命令,这可能会带来一些好处,但我意识到关于鱼的问题可能对很多人没用。
也许有办法从节点内获取这些参数?我可能错过了一个隐藏的环境变量?我将如何创建一个区分引用和不引用参数的$ n 1 + "1"
,以便输出11
?
包装或转义是不可接受的解决方法!
答案 0 :(得分:1)
我如何创建$ n 1 +“1”来区分引用和不引用的参数,以便输出11?
你没有。 shell脚本的一个基本思想是适用于fish和bash,它是shell处理你的参数然后将它们传递给程序。
这不仅适用于引号(使用它们以便将"file with spaces"
作为一个参数传递,或者'$var'
不进行变量扩展),而且也适用于*
(它做全球化)和$
(根据shell进行一系列扩展)。
除非你特别想要依赖运行程序的特定shell(你可能没有),否则无法关闭它。
一种可能的解决方法是将您的工具用作REPL,以便用户调用n
,然后键入表达式。
另一种方法是将整个表达式作为一个参数,因此用户可以使用
n '1 + "1"'
您将收到1 + "1"
。
我也相信你会略微高估这个问题。如果你正在使用shell,你通常需要执行这种转义,如果你的工具突然没有它,那么实际上更多会让人感到困惑,而不是更少。