ruby のパーセント記法の文法はどうなっている？


%x() の構文を使って、コマンドを実行してみようとしました。

構文の中身は、基本的にはただのシェルスクリプトですが、シェルとして書いた場合にパーセントの文法とぶつかって意図しない動作が引き起こされたらいやだな、と考えています。

質問:

  * パーセント記法の中の文法 (syntax 的な仕様) について記述されている資料などはありますか？




[%記法](https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#percent)である

[code]

    %x(コマンドの文字列)
    
[/code]

は[コマンド記法](https://docs.ruby-
lang.org/ja/latest/doc/spec=2fliteral.html#command)である

[code]

    `コマンドの文字列`
    
[/code]

の別の記述方法に過ぎません。コマンド記法と同じく **バックスラッシュ記法** や **式展開**
が行われます。「`」の場合との違いは「`」自身があらわれるときに`\`でエスケープする必要が無いと言うことです。代わりに、枠の終端である「)」は対応する「(」がない場合はエスケープする必要があります。他、枠として使う記号は変更でき、それぞれ対応する物に対してエスケープが必要になる場合があります。

[code]

    str = 'hoge'
    `(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_\`date +%Y%m%d\` ')]}!')`
    %x((echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` '\)]}!'))
    %x[(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')\]}!')]
    %x{(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')]\}!')}
    %x!(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')]}\!')!
    
[/code]

上は全て同じです。`()`等は対応するカッコが組になっているときはエスケープの必要が無い(してはいけない)ことに注意してください。組になっていない所はエスケープする必要があります。




[%記法](https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#percent)である

[code]

    %x(コマンドの文字列)
    
[/code]

は[コマンド記法](https://docs.ruby-
lang.org/ja/latest/doc/spec=2fliteral.html#command)である

[code]

    `コマンドの文字列`
    
[/code]

の別の記述方法に過ぎません。コマンド記法と同じく **バックスラッシュ記法** や **式展開**
が行われます。「`」の場合との違いは「`」自身があらわれるときに`\`でエスケープする必要が無いと言うことです。代わりに、枠の終端である「)」は対応する「(」がない場合はエスケープする必要があります。他、枠として使う記号は変更でき、それぞれ対応する物に対してエスケープが必要になる場合があります。

[code]

    str = 'hoge'
    `(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_\`date +%Y%m%d\` ')]}!')`
    %x((echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` '\)]}!'))
    %x[(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')\]}!')]
    %x{(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')]\}!')}
    %x!(echo #{str};\n [ "#{str}" = "hoge" ] && echo #{str}_`date +%Y%m%d` ')]}\!')!
    
[/code]

上は全て同じです。`()`等は対応するカッコが組になっているときはエスケープの必要が無い(してはいけない)ことに注意してください。組になっていない所はエスケープする必要があります。

