スクリプト関数呼び出し:関数と$(function)

スクリプト関数呼び出し:関数と$(function)

簡単にするために、次のコードを参照してください。

#!/bin/bash

number=7

function doSomething() {
  number=8
}

doSomething
echo "$number"

印刷されます8

しかし、一緒に:

#!/bin/bash

number=7

function doSomething() {
  number=8
}

$(doSomething)
echo "$number"

印刷されます7

次の質問があります。

  • 何ですか技術名それぞれについて? 、私の言葉はfunctioncall$(functioncall)
  • 各方法はどのように機能しますか?前者は関数自体の外部の変数を考慮(影響)するのに対し、後者はそうではないようです。
  • ある方法を他の方法よりも強制する必要がある場合(主にパフォーマンスの問題について - もちろん - ある場合)、他の理由がある場合は歓迎します。

答え1

あなたは命令の置き換えの微妙さを経験しています。

電話

doSomething

単純な関数呼び出しです。関数のコマンドを呼び出した場所にコピーして貼り付けたかのように関数を実行します。したがって、number変数は新しい値で上書きされます8

電話

$(doSomething)

一方、コマンドの置き換え。その目的は機能を実行することです。関数が印刷する内容を返します。 stdout。通常、「スタンドアロン」として使用されず、変数割り当て内で使用されます。

os_type=$(uname)

これにより、Linuxシステムがコンソールにuname印刷され、結果がシェル変数に保存されるコマンドが実行されます。したがって、何も出力しないコマンドや関数を使用してください(たとえば、あなたのようなものです。実際、置換はデフォルトで出力のプレースホルダなので、スクリプトエラーが発生しない唯一の理由は、関数が出力しないことです。 、何でも言いましたか?Linuxos_typedoSomething$(doSomething)doSomething

$(uname)

変える

$(doSomething)

シェルはコマンドを実行しLinuxて生成を試みます。

Linux: No such file or directory

エラー(1)

観察している効果を理解する重要なポイントは、コマンドの置き換えにあります。このコマンドはサブシェルで実行されます。つまり、変数に対するすべての変更は、基本スクリプトを実行するシェルに逆伝播されません。したがって、内部的にコマンドを実行し、doSomething変数をnumberに設定している間は、独自のシェルプロセスで8これを実行します。これは、スクリプトをstdout検索する以外に、スクリプトを実行するシェルプロセスとは関係ありません。number基本スクリプトで使用される変数は変更できません。

詳細については、以下を確認してください。

このウェブサイトまたは

詳細を確認してください。


(1)一方、これはコマンド置換を使用してスクリプトを作成するときに名前がわからないコマンドを実行することができますが、知っている他のコマンドを実行するとコマンドの名前を理解できることを意味します。 。

関連情報