我正在通过Node.js以编程方式执行shell命令,结果是true
...字面上<string> true
,但我无法将它与boolean
和{{1}进行比较}}
string
我尝试转换const exec = require('child_process').exec;
exec('docker inspect -f {{.State.Running}} service-redis', (err, stdout, stderr) => {
// here stdout has value "true"
console.log(typeof stdout) // returns "string"
console.log(stdout == 'true') // returns false
console.log(stdout == true) // returns false
});
以防万一,但结果是一样的。我很迷惑。有什么想法吗?
答案 0 :(得分:2)
你需要修剪字符串,因为它以换行符的形式在末尾有不可见的空格。
const exec = require('child_process').exec;
exec('docker inspect -f {{.State.Running}} service-redis', (err, stdout, stderr) => {
// here stdout has value "true"
console.log(stdout.trimRight() === 'true')
});
请注意,尾随换行符不是Node做任何奇怪的事情。通常情况下,程序会在其控制台输出中附加换行符,特别是如果人类正在查看它。事实上,这是one of the things console.log()
为您做的。
想象一下,如果您每天使用的程序(ls
,git
,...)在没有换行符的情况下终止其输出,请使用您的终端。您的提示(您键入的位置之前的标记,例如$
)将与最后一个程序的输出位于同一行。呸!
甚至文件通常以换行符结束,因为这个makes it easier可以将来自各种来源(例如日志文件)的数据连接在一起并使用UNIX工具。还有一种广泛的做法是让您的代码编辑器为您强制执行此操作。简而言之,你会看到这一切。
childProcess.exec()
方法没有对这些新行约定做出任何假设,它对于它来说太低级了,所以它使它们保持原位。除了tiny modules的问题之外,您可以轻松地在exec()
之上创建一个抽象来处理修剪。