質問がロックされた後の私の答え

質問がロックされた後の私の答え

私はUbuntu 16.04とBashを使っていて、次の内容を読もうとしています。ウィキペディア、存在するここそしてここしかし、シェルスクリプト、特にBashでは、次のように「コマンドの置き換え」の意味を理解できません。

$(command)

または

`command`

これはどういう意味ですか?

編集:この質問を初めて投稿したとき、私はすでに純粋な交換の概念とLinuxの概念について知っていました。変数の置換(変数をその値に置き換えることによって)しかし、何らかの理由で文書内でこのシェル機能の目的をまだ見逃していました。


質問がロックされた後の私の答え

コマンド置換は、コマンドを実行し、そのコマンドを実行する特別な構文を使用するアクションです。出力後で使用するために変数として保存(保存)されます。

一例date

thedate="$(date)"

その後、次を使用して結果を印刷できますprintf

printf 'The date is %s\n' "$thedate"
  1. コマンドの代替構文はです$()
  2. コマンド自体はですdate
  3. $(date)これを組み合わせると、その値が代替の結果であることがわかります(後で取得できます)。実装する)。
  4. $thedate後で使用できるように、この値を変数に保存します。
  5. printf上記のコマンドに従って変数に保存されている出力値を表示するために使用します。

注:\ninは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' )

これはコマンド置換とも異なります。

おすすめ記事