在Multiix中将Multiline,Quoted字符串作为单个命令行参数传递?

Coo*_*ies 7 unix linux string bash

我只需要传递任何HTML内容作为命令行参数,其中包含',',`等字符?什么不是?如何在unix中将其作为单个参数传递?

ric*_*ici 7

如果您在命令行中输入,则可以使用以下技巧:

some_program -some_option some_argument "$(cat)"
any text you like with ` or " or $ or < or whatever
^D
Run Code Online (Sandbox Code Playgroud)

最后一件事是 control-D(文件结尾)

要将其放入 bash 脚本中,您可以使用 Here 文档:

some_program -some_option some_argument "$(cat <<'EOF'
any text you like with ` or " or $ or < or whatever
EOF
)"
Run Code Online (Sandbox Code Playgroud)

只要文本不完全是字符 EOF(如果是,您只需将两个地方的 EOF 更改为其他内容),这将起作用。

但我认为这些都不是你想要做的。我认为您正试图从另一个程序(在 Lua 中)调用一个程序。不幸的是,Lua 开箱即用并没有提供任何可以做到这一点的功能。它只提供了 os.execute,它使用 shell(/bin/sh,而不是 bash)来解释命令行。

spawnMark Edgar 写的Lua 有一个很好的实现,但我不知道它是否还在维护。否则,您仍然可以使用第二个 hack:

require("os")

function call_with_arg(prog, rawtext)
  return os.execute(prog.." \"$(cat <<'EOF'\n"..rawtext.."\nEOF\n)\"")
end
local html =
  [=[<html><body><img src="image.png" onload='alert("loaded")'/></body></html>]=]

call_with_arg("echo >somefile.txt", html)        
Run Code Online (Sandbox Code Playgroud)


MrE*_*MrE 7

我一直在寻找问题的答案,但我在这里并没有真正看到它,所以这是我最终得到的解决方案(不是我没有传递 HTML 或类似的东西,而是类似的)

例如,这些psql工具接受的命令可以是多行,但需要在双引号字符串中传递。

我从其他推荐的答案开始:

CMD=$(cat << EOM
CREATE TABLE mytable
        (
          id bigint NOT NULL,
          sid bigint NOT NULL,
          obs timestamp without time zone NOT NULL,
          rcv timestamp without time zone NOT NULL,
          uid bigint NOT NULL,
          CONSTRAINT pkey PRIMARY KEY (id)
        )
EOM
)

sudo -u postgres psql db -c $CMD
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为命令现在缺少引号,并且使用“$CMD”不会删除换行符,因此它仍然作为多行传递......

然而

echo $CMD将在一行中打印命令

所以最后使用:

CMD=$(echo $(cat << EOM
CREATE TABLE mytable
            (
              id bigint NOT NULL,
              sid bigint NOT NULL,
              obs timestamp without time zone NOT NULL,
              rcv timestamp without time zone NOT NULL,
              uid bigint NOT NULL,
              CONSTRAINT pkey PRIMARY KEY (id)
            )
EOM
))

sudo -u postgres psql db -c "$CMD"
Run Code Online (Sandbox Code Playgroud)

实际上将该行用双引号括起来,形成单行命令。

我希望这对其他人有用。


fkl*_*fkl 2

如果我正确理解您的要求,您可以从命令行中用双引号传递任何内容,即“”。它将被视为单个参数并在程序中作为字符串接收,可以根据需要进行解析。

这是交流程序

#include <stdio.h>

int main(int c, char *argv[])
{
        printf("argument is %s\n", argv[1]);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

在控制台上,我编译并运行它

$ gcc args.c
$ ./a.out "<img src=\"image.png\" onload='alert(/loaded/)' />"
Run Code Online (Sandbox Code Playgroud)

输出是

论点是

 <img src="image.png" onload='alert(/loaded/)' />
Run Code Online (Sandbox Code Playgroud)

对于参数中的特殊字符,例如“”(双引号)、反斜杠 \ 等,只需在这些字符前面加上额外的转义序列 \

  • 当许多字符出现在双引号字符串内时需要转义,包括双引号本身。请注意,打印出来的字符串在“image.png”周围没有引号。如果您将其运行为`./a.out "&lt;img src=\"image.png\" onload='alert(/loaded/)' /&gt;"`,则双引号将包含在参数中。 (2认同)