一种防止bash使用转义符号解析命令行的方法

时间:2015-06-18 14:19:43

标签: linux bash shell command-line command-line-arguments

我正在寻找一种方法("。",'。',\。)以防止使用bash(或任何其他Linux shell),同时防止它来自解析命令行的各个部分。问题似乎无法解决 How to interpret special characters in command line argument in C?

理论上,一个简单的开关就足够了(例如-x ......告诉它 字符串......不会被解释)但它显然不存在。我想知道是否有解决这个问题的解决方法,黑客或想法。原始问题是将youtube URL(可能包含特殊字符(&,等))作为参数的程序的脚本别名。这个问题更加困难:扩大" $ 1"同时阻止shell解释扩展的字符串 - 基本上,扩展" $ 1"不解释其结果

3 个答案:

答案 0 :(得分:2)

使用here-document

myprogramm <<'EOF'
https://www.youtube.com/watch?v=oT3mCybbhf0
EOF

如果用单引号包装起始EOF,bash将不会解释here-doc中的任何特殊字符。

答案 1 :(得分:0)

简短的回答:你不能这样做,因为shell解析命令行(并解释像“&amp;”之类的东西),甚至在决定你的脚本/别名/将要运行的内容之前,更不用说你的脚本完全可以控制的地方了。当你的剧本在这个过程中有任何影响时,已经太晚了。

脚本中,很容易避免大多数问题:用双引号包装所有变量引用。例如,您应使用curl -o $outputfile $url而不是curl -o "$outputfile" "$url"。这将阻止shell在将变量传递给命令(/ other script / whatever)之前对变量的内容应用任何解析。

但是当您运行脚本时,您将始终必须引用或转义在命令行上传递的任何内容。

答案 2 :(得分:0)

您的规格仍然不是很清楚。据我所知,问题是你想完全重新发明shell如何处理参数。所以......你必须编写自己的shell。基本要求甚至都不困难。这是伪代码:

while true:
    print prompt
    read input
    command = (first input)
    args = (argparse (rest input))
    child_pid = fork()
    if child_pid == 0: // We are inside child process
        exec(command, args) // See variety of `exec` family functions in posix
    else: // We are inside parent process and child_pid is actual child pid
        wait(child_pid) // See variety of `wait` family functions in posix

你的问题基本上归结为&#34; argparse&#34;功能实现。如果它只是一个身份功能,那么你根本就没有扩展。这就是你想要的吗?