Advanced Bash-Scripting Guide 、例27-4 、下から7行目、私はこれを読みました:
関数は次のように実行されますサブプロセス。
Bashでテストを行いましたが、上記のステートメントが間違っているようです。
検索このサイト、Bash Man、および私の検索エンジンは何の光も当てません。
答えはありますか?説明したいですか?
コメント
- 前述のように、そのガイドは極端に誤解を招くものです。代わりに、ウーレッジバッシュガイドをお勧めします。
- 重要な事実は、"バッシュ"はサブシェルの作成を回避します。それらは高価であり、独自の環境を持っており、スクリプトのパフォーマンスとコードの流れ方に影響を与えます(多くの場合、それらの特殊性に対処するために不便です)。 Bashの実際の状態は、進化、コード進化の産物です。つまり、Bashの最初のバージョンは、実際のサブシェルよりも多くのサブシェル***を使用します。この種の矛盾は合理的であるように思われます。 ***証拠が必要な場合は、'提供できません。 'ウェブページ、コメントから派生しました… 'そのステートメントをどこか前に読んだことがあります。
回答
Advanced Bash-Scripting Guideは常に信頼できるとは限らず、そのサンプルスクリプトには、
コマンド置換のバックティックを事実上非推奨にしました。つまり、$(command)
ではなく`command`
です。
この特定のケースでは、明らかに正しくありません。
(正規の)Bashのシェル関数に関するセクションマニュアルには、
シェル関数は現在のシェルコンテキストで実行されると明確に記載されています。それらを解釈するための新しいプロセスは作成されません。
コメント
- "高度なBashスクリプトガイドは一般的に信頼性がありません" 非常に真実です。
- あなたをサポートするための参照を提供できますか最初の文?
- @WillVousdenここでの参照はどのようになりますか?ガイドの'の技術的な不足の例はたくさんありますか? bashコミュニティの専門家が以前にそれが信頼できないと指摘した文書? bashにゴールドのバッジが付いたstackoverflowメンバーがコメントで同意した場合、役に立ちますか? :p
- @WillVousden私は'あなたが望むものが信頼できる形で存在するとは思いません。 Mendel Cooperは過去にガイドの問題を更新および修正しましたが、公開されているバグトラッカーやエラッタのリストはありません。 (おそらく、それは私ができる最もひどい発言です。)したがって、(認識された、または実際の)欠陥を見つけた場合、私たちにできることは、作者に電子メールを送り、最善を願うことだけです。
- @ WillVousden、.. .freenode#bashチャネルでABSを回避する必要があるというコンセンサスがどのくらい続いているかについての履歴が必要な場合は、 wooledge.org/を参照してください。 〜greybot / meta / abs -各行の2番目のフィールドはタイムスタンプで、最初のフィールドはユーザー名です。 '問題のユーザー名が非常に尊敬されている個人であるという主張で十分であることを願っています。
回答
中括弧関数は、次のような独自のサブシェルが必要な場合を除いて、呼び出し元のシェルプロセス内で実行されます。
- バックグラウンドで実行する場合
&
- パイプラインでリンクとして実行する場合
リダイレクトまたは追加の環境。変数は新しいサブシェルを強制しません:
hw(){ echo hello world from $BASHPID echo var=$var } var=42 hw >&2 echo $BASHPID #unexports var=42 and restores stdout here
カーリーの代わりに括弧を使用して関数を定義する場合:
hw()( echo hello world from $BASHPID ) hw echo $BASHPID
常に新しいプロセスで実行されます。
コマンド置換$()
も常にbashでプロセスを作成します(ただし、kshでは作成されません。内部でビルトインを実行します。)
コメント
- 知らなかった'
f() (...)
は許可されています。{...}
と(...)
以外に他の定義はありますか?Bashでは'まだ他の人には入っていません。 - @tomas
function hw { echo hello world; }
構文を使用できます(()
function
と入力し、最後の}
または)
hw(){ echo error; } >&2
のように。'についてです。 - これそれは私がすぐに考えた答えであり、それは絶対に正しいです。正解として投票する必要があります。
f()(...)
は常に独自のシェルを実行しますが、f(){...}
は実行しません。 - NBbash関数は任意の複合コマンドを受け入れるため、
foo() [[ x = x ]]
も有効な関数定義です。ただし、type foo
を使用して関数を見ると、'これが。サブシェル関数についても同じことが言えます。bar() ( : )
はbar() { ( : ); }
になります。 - @kojiro nice + 1。しなかった'知らなかった
回答
コマンドその例の質問は次のようになります:
echo ${arrayZ[@]/%e/$(replacement)}
後で説明する例:
# $( ... ) is command substitution. # A function runs as a sub-process.
ABSガイドに慈善的であるため、彼らが書くことを意図していたのは、関数がコマンド置換内で実行され、コマンド置換内のコマンドがサブシェル内で実行されるということです。
コメント
- その'は非常に誤解を招く恐れがあります。解釈していただきありがとうございます。
- @tomas "非常に誤解を招く恐れがあります。" はい、非常に。 ABSガイドとは対照的に、 Greg ' s Wiki は高度なbash情報の優れた情報源です。
- 乾杯。 'これについてのあなたの意見は何ですか: wiki.bash-hackers.org/start ?
- @tomas私はそのことを直接知っていません。
- @tomas、… bash-hackers wikiに関する私自身の意見は、' sは優れたソースです。 ' Wooledge wikiほど包括的には理解していませんが、正確で正確に書かれている傾向があります。