在linux中编程使用terminal会转义我的命令

nnt7mjpx  于 2023-02-21  发布在  Linux
关注(0)|答案(2)|浏览(116)

使用nodeJS exec函数从一个新进程运行我的命令会覆盖我的反斜杠,这会使我的命令无效。如何防止这种情况或使用解决方案?
我需要最后一个命令如下所示:
...drawtext=text='timestamp \: %{pts \: localtime...
使用该代码,\:被转义为:
使用\\:被转义为\\:,而我期望使用\:
如何运行...drawtext=text='timestamp \: %{pts \: localtime...

// This command works if pasted directly into terminal
const ffmnpegCode = `ffmpeg -i /path/input.mp4 -y -r 25   -ss 0 -to 124 -c:v libx264 -c:a aac -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,drawtext=text='timestamp \: %{pts \: localtime \: 1665679092.241 \: %m-%d-%Y %H\\\\\:%M\\\\\:%S}': x=(w-text_w-10): y=(h-text_h-5): fontsize=45: fontcolor=white@0.9: box=1: boxcolor=black@0.6: fontfile='/path/OpenSans-Regular.ttf'" /path/output.mp4`
const encode = async ffmpegCode => {
    try {
        await execPromise(ffmpegCode);
        return 200
    } catch (err) {
        console.log(err)
    }
}

JS添加了额外的\,这会破坏我的命令

a1o7rhls

a1o7rhls1#

事实证明,JS确实试图在运行我的命令之前对我的特殊字符进行转义,所以诀窍是使用String.raw()
const command = String.raw...drawtext=text='timestamp : %{pts : localtime...``

myzjeezk

myzjeezk2#

如果您不需要任何shell功能,请使用execFilespawn,它们允许您指定直接传递给exec的参数数组,因此不需要任何shell转义。

import { execFile } from 'node:child_process'
const child = execFile('/some/ffmpeg', [
  `-i`, `/path/input.mp4`
  `-vf`, `setsar=1,drawtext=text=timestamp \\: %{pts \\: localtime \\: 1665679092.241 \\: %m-%d-%Y %H\\:%M\\:%S}: x=(w-text_w-10): y=(h-text_h-5)`,
  `/path/output.mp4`,
], console.log)

不需要shell引号或转义,只需要JS字符串转义序列(如\\,用于命令获取\

相关问题