4354


動作環境: CentOS 6.5 + bash

bashでコマンドの結果を変数に入れる時

[code]

    val=$(cmd)
    
[/code]

と

[code]

    val=`cmd`
    
[/code]

の書き方があるようですが、この二者の違いはあるのでしょうか? 単に好みの問題でどちらかを使えばいいものでしょうか?

片方にはできて、もう片方にはできないような処理があるのでしょうか?


CC BY-SA 3.0
2015-01-10T01:26:04.523
4353
2019-11-28T00:30:35.933
4840
question
bash
bash > $(cmd)と`cmd`の違い


`bash(1)` から引用します。

> Command Substitution
>
> Command substitution allows the output of a command to replace the command
> name. There are two forms:
>
> $(command)  
>  or  
>  `command`
>
> When the old-style backquote form of substitution is used, backslash retains
> its literal meaning except when followed by $, `, or . The first backquote
> not preceded by a backslash terminates the command substitution. When using
> the $(command) form, all characters between the parentheses make up the
> command; none are treated specially.
>
> Command substitutions may be nested. To nest when using the backquoted form,
> escape the inner backquotes with backslashes.
[code]

    $ echo `echo \``
    bash: command substitution: line 1: unexpected EOF while looking for matching ``'
    bash: command substitution: line 2: syntax error: unexpected end of file
    $ echo `echo \\\``
    `
    $ echo $(echo \`)
    `
    
    $ echo `echo `echo "xyz"``
    echo xyz
    $ echo `echo \`echo "xyz"\``
    xyz
    $ echo $(echo $(echo "xyz"))
    xyz
    
[/code]


CC BY-SA 3.0
2015-01-10T01:54:19.360
4354
2015-01-10T02:15:09.127
2015-01-10T02:15:09.127
4353
answer


ネストの深い$(cmd)形式と`cmd`形式の使い方例です。  
`cmd`形式ではネストが増えるにつれ、バッククォート(`)をエスケープする`\`の個数が2の累乗個ずつが増えます。

[code]

    echo `echo \`echo "xyz"\``
    echo `echo \`echo \\\`echo "xyz"\\\`\``
    echo `echo \`echo \\\`echo \\\\\\\`echo "xyz"\\\\\\\`\\\`\``
    echo `echo \`echo \\\`echo \\\\\\\`echo \\\\\\\\\\\\\\\`echo "xyz"\\\\\\\\\\\\\\\`\\\\\\\`\\\`\``
    
    echo $(echo $(echo "xyz"))
    echo $(echo $(echo $(echo "xyz")))
    echo $(echo $(echo $(echo $(echo "xyz"))))
    echo $(echo $(echo $(echo $(echo $(echo "xyz")))))
    
[/code]

私事ですが、以前は`Bourne Shell`縛りでshスクリプトを書いていました。※今は違います。  
現在も`Bourne Shell`ユーザが少なからずいらっしゃると思いますので、ネストを増やした例を挙げました。


CC BY-SA 4.0
2019-11-27T11:59:13.317
60891
2019-11-28T00:30:35.933
2019-11-28T00:30:35.933
35558
35558
4353
answer