私はUbuntu 16.04とBashを使っていて、次の内容を読もうとしています。ウィキペディア、存在するここそしてここしかし、シェルスクリプト、特にBashでは、次のように「コマンドの置き換え」の意味を理解できません。
$(command)
または
`command`
これはどういう意味ですか?
編集:この質問を初めて投稿したとき、私はすでに純粋な交換の概念とLinuxの概念について知っていました。変数の置換(変数をその値に置き換えることによって)しかし、何らかの理由で文書内でこのシェル機能の目的をまだ見逃していました。
質問がロックされた後の私の答え
コマンド置換は、コマンドを実行し、そのコマンドを実行する特別な構文を使用するアクションです。出力後で使用するために変数として保存(保存)されます。
一例date
:
thedate="$(date)"
その後、次を使用して結果を印刷できますprintf
。
printf 'The date is %s\n' "$thedate"
- コマンドの代替構文はです
$()
。 - コマンド自体はです
date
。 $(date)
これを組み合わせると、その値が代替の結果であることがわかります(後で取得できます)。実装する)。$thedate
後で使用できるように、この値を変数に保存します。printf
上記のコマンドに従って変数に保存されている出力値を表示するために使用します。
注:\n
inはprintf
改行文字です。
答え1
「コマンドの置き換え」は、コマンドを実行し、そのコマンドの出力がコマンドのテキストを置き換えることを可能にする機能のシェル言語名です。
シェル言語には、これを実行できる他の機能はありません。
コマンドの置換、つまり完全な$(...)
式は次のとおりです。交換済みこれは出力によるコマンド置換の主な用途です。
コマンド置換によって実行されるコマンドはサブシェルで実行されます。これは独自の環境を持ち、親シェルの環境には影響しません。
ただし、すべてのサブシェルの実行がコマンドの代替であるわけではありません(最後の追加の例を参照)。
サブシェルでコマンドの置き換えを示す例:
$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123
ここで変数はs
文字列に設定されます123
。次の行では、echo
コマンド置換の結果を含む文字列が呼び出されます。コマンド置換はs
文字列に設定され、world
その文字列をエコーします。文字world
列コマンド置換のコマンド出力したがって、以下で実行すると、上記の2行目が端末で生成されるset -x
ように拡張されることがわかります。echo 'hello world'
hello world
$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world
(コマンド代替サブシェルの各レベルにトレース出力の追加プロンプトレベルを追加しますbash
。他のシェルではこれを行わないことがあります。)+
最後に、コマンド置換のコマンドは、呼び出しシェルの値に影響を与えないため、独自のサブシェルで実行されることを示していますs
(値はs
まだ同じ123
ですが、そうではありませんworld
)。
次のように、サブシェルでコマンドを実行する必要がある他の状況もあります。
echo 'hello' | read message
では、bash
このlastpipe
オプションを設定しない限り(非対話型インスタンスでのみ)read
サブシェルで実行されます。つまり、$message
親シェルでは変更されません。つまり、echo "$message"
上記のコマンドの後に実行すると、空の文字列(または任意の文字列)がエコーされます。値)は$message
以前です。
プロセス置換はbash
サブシェルでも行われます。
cat < <( echo 'hello world' )
これはコマンド置換とも異なります。
答え2
a=$(command)
結果値をcommand
変数に保存します。
本当にもうありません。
ちなみに私は次のように信じています。
a=`command`
廃止され、上記と同じ意味を持ちます。