linux命令中的转义空间

linux命令中的转义空间,linux,bash,Linux,Bash,我想用其他东西替换linux命令中的空间。 例如: echo "test" ---> echo\040"test" cmd="echo,foo" IFS=, eval $cmd 我知道\040不起作用,但我正在寻找合适的替代品。由于chepner的洞察力,我现在确信只要您需要传递一个参数就不可能了(因为您必须将命令与参数分隔一个空格)。但是,如果您不这样做(即,如果参数始终相同),您可以创建一个脚本或函数,该脚本或函数将执行包含空格的代码,这些代码可以在不使用空格的情

我想用其他东西替换linux命令中的空间。 例如:

echo "test"     --->      echo\040"test"
cmd="echo,foo"
IFS=,
eval $cmd

我知道\040不起作用,但我正在寻找合适的替代品。

由于chepner的洞察力,我现在确信只要您需要传递一个参数就不可能了(因为您必须将命令与参数分隔一个空格)。但是,如果您不这样做(即,如果参数始终相同),您可以创建一个脚本或函数,该脚本或函数将执行包含空格的代码,这些代码可以在不使用空格的情况下调用。

通常,您无法执行此操作。shell解析器的工作原理大致如下:

  • 仅根据空格(空格和制表符)将行拆分为单词
  • 将展开应用于每个初始单词集
  • 确定要运行并执行的命令
  • 你的问题是你想改变第一步中单词的识别方式;你不能这样做


    在某些上下文中,可以使用
    eval
    执行预解析的命令。例如:

    echo "test"     --->      echo\040"test"
    
    cmd="echo,foo"
    IFS=,
    eval $cmd
    
    这会输出
    foo
    ,因为当展开未加引号的
    $cmd
    时,它会在分词后生成两个空格分隔的单词,
    echo
    foo
    。然后由
    eval
    执行,产生所需的结果。但是,强烈建议您在实践中不要编写这样的代码,因为使用
    eval
    可以很容易地执行您不打算执行的代码


    对于您给出的示例(用户输入
    ping x.x.x.x
    ),您应该这样做。您将输入视为执行脚本提供的代码的请求,而不是作为代码执行输入

    read cmd argument
    case $cmd in
        ping) ping "$argument" ;;
        *) printf 'Unrecognized command "%s"\n' "$cmd" >&2 ;;
    esac
    

    现在,没有任意执行。无论用户输入什么,您的脚本要么用一个参数执行ping,要么打印一条错误消息。

    我不知道这是否是您所期望的

    $cat j
    echo "test"
    
    用换行符替换空格

    $ cat j|sed -e 's/\s/\xC/'g
    echo
        "test"
    

    您可以尝试使用空格以外的其他空格。制表符,CR,LF

    如果它直接在bash中运行,则可以使用定义的shell变量:

    echo$IFS"test"
    
    或者使用类似c的字符串转义命令并运行该字符串:

    $(cat<<<$'echo\x20test')
    

    $(catYes,这已经有一个空格了!我需要一个不包含任何空格的替代方案!!哦!那么Mark Plotnik的评论就适合你了。我将修改我的答案以扩展它。不,Mark的评论在这种情况下没有帮助:尝试
    IFS=,
    然后是
    echo,foo
    。你会得到一个“找不到命令”错误,而不是打印“foo”.@chepner这就是我目前正在尝试的,但它不应该工作吗?或者IFS的使用仅限于某一组函数性?解析器首先根据空格将行拆分为单词;
    IFS
    仅用于在最终执行命令之前扩展行的后期阶段进行单词拆分。c是什么ontext?通常情况下,您无法更改解析器最初解析命令行时使用的内容。@LucM我的服务有限,只能传递带有参数的有限关键字。例如,ping x.x.x.x我尝试过,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。我是一支钢笔-测试员和我要完成观察,我需要确保此漏洞的危险程度。例如,用户是否能够修改或添加并执行文件?用户(入侵者)必须更改命令由于命令解析器似乎对空间敏感,因此无法使用无空间命令。我的服务有限,只能传递带有参数的有限关键字。例如,ping x.x.x.x我尝试过,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。另外还有关于ping x.x.x.x&cat