bash
  • shell
  • unix
  • 2011-03-10 95 views 1 likes 
    1

    我有代碼:猛砸報價樂趣

    sudo_cmd="echo -e \\"$cmd\\" >> $CACHE_CONF" 
    echo "$sudo_cmd" 
    

    ,打印字符串:

    回聲-e「K1 = '的memcached://主機/' \ NK2 =「的memcached://主機/'\ n」 >> /opt/settings.py

    ,如果我在shell中執行它工作正常,這裏導致settings.py

    K1 = 'memcached://host/' 
    K2 = 'memcached://host/' 
    

    然而,當我通過ssh執行此命令:

    ssh [email protected]$host "sudo sh -c \"$sudo_cmd\" 
    

    結果在settings.py不同的是:

    K1 =分佈式緩存://主機/ NK2 = memcached:// host/n

    儘管-e選項echo,換行符不起作用。

    我做錯了什麼?

    更新:

    str="a\nb" 
    cat >> settings.py <<< "$str" 
    

    也不起作用。

    +0

    您正在定義'$ str'不正確。 – 2011-03-10 13:48:37

    +0

    我明白了。 str =「a \ nb」和str = $'a \ nb'之間有什麼區別?第二個選項有效。 – lstipakov 2011-03-10 14:07:47

    +1

    '$'...''告訴bash解釋引用字符串中的任何轉義碼。 – 2011-03-10 14:09:15

    回答

    1

    你的問題是你的逃生。

    假定該

    cmd="K1 = 'memcached://host/'\\nK2 = 'memcached://host/'\\n" 
    

    然後你sudo_cmd分配必須

    sudo_cmd="echo -e \\\"$cmd\\\" >> $CACHE_CONF" 
    

    注意額外的反斜槓引號。

    0

    您需要在$ cmd字符串中再次轉義\ n,所以它會是\ n,然後這將正確轉移到新字符串。

    +0

    你能再舉一個例子怎麼逃避\ n? – lstipakov 2011-03-10 13:18:21

    0

    \n\正在由ssh正在其中運行的殼處理。要麼使用定界符/ herestring與cat,或者使引述更加複雜。

    cmd=$'...\n...' 
    ssh ... "cat >> $CACHE_CONF" <<< "$cmd" 
    
    +0

    那麼ssh調用應該如何呢? rame結果如下:ssh $ user @ $ host「sudo sh -c \」cat >> $ CACHE_CONF \「<<< \」$ cmd \「」 – lstipakov 2011-03-10 13:11:33

    +0

    就像我所展示的,但帶有sudo。 – 2011-03-10 13:13:22

    +0

    與ssh $ user @ $ host相同「sudo cat >> $ CACHE_CONF」<<<「$ cmd」 – lstipakov 2011-03-10 13:17:11

    相關問題