問題タブ [command-substitution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - プロセスをフォアグラウンドにする Bash コマンド置換 ( $(...) )
概要:バックグラウンドでプロセスを実行する bash スクリプトがあり、通常のコマンドとして、および などのコマンド置換ブロック内で動作するはず$(...)
です。スクリプト自体が、バックグラウンドに分岐するプロセスを生成します。このテスト ケースに縮小できます。
このスクリプトをシェルで実行するとすぐに復帰し (そして「何か」を出力します)、内部で実行すると$(...)
5 秒間ハングし、バックグラウンドの「スリープ」が終了するのを待ちます。
コマンド置換シェル内で開始され、バックグラウンドでプロセスを生成するすべてのものに適用されます。これには、明らかにそのプロセス ツリー内のすべての子が含まれます。bash と zsh の両方に影響するようですが、他は試していません。
元の質問:値を stdout に出力し、実行するたびにそれを X クリップボードにコピーすることになっている bash スクリプトがあります。
このスクリプト(「何か」と呼びましょう)は、この単語(実際には別のコマンドの出力)を取得するために使用され、次のようなさまざまな方法で使用されることを意図しています。
通常の stdout に出力し、出力をクリップボードにコピーして通常の X アプリケーションで使用します。また、bash コマンド置換で stdout を使用して、この単語を任意のコマンドの途中に挿入することもできます。
xclip
ただし、bash コマンドの置換は、フォアグラウンドでの存続を強制するようです。xclip
X クリップボードはクライアントがクリップボードの内容を提供する必要があるため、通常は自身をデーモン化します。デフォルトの動作では、クリップボードの内容が置き換えられると終了します。
xclipでこの問題が発生した後、この質問の冒頭で書いた最小限のテストケースを作成したので、$(...)
シェル内でデーモン化するものはすべて適用されるようです
誰でもこの動作を説明できますか? 回避する方法はありますか?
bash - BashのIFS変数はコマンド置換にどのように影響しますか?
コマンド置換の出力をループし、ループ本体内で別のコマンド置換を実行しようとする bash スクリプトを作成しています。コードは次のとおりです。
IFS を newline に設定して、ループがスペースで区切られた各単語を反復するのではなく、xmllint コマンドの出力の各行を反復するようにします。ただし、これにより、ループ内のコマンド置換が失敗します。デバッグの結果、問題の本質は次のとおりであるという結論に達しました。
エラーが発生します:
ループ内で IFS をリセットすることにより、最初のコード例で修正を試みたことがわかります。それはうまくいきませんでした。
スクリプトの別のイディオムを使用して問題を解決できることに気付きました。
たとえば、1 つの可能性を示すために、個々の行で awk を実行する代わりに、xmllint コマンドを awk に置き換えるプロセス。その趣旨のコメントは大歓迎ですが、以下に関連する回答を提出してください。
- IFS を改行に設定すると、コマンド置換で生成されたエクスポートが台無しになるのはなぜですか?
- ループ内で IFS をリセットしても問題が解決しないのはなぜですか?
更新: Barmar との議論によると、IFS はコマンド/変数展開後の単語分割に使用されます。
regex - コマンド置換と正規表現を組み合わせるには?
正規表現でコマンド置換を行う可能性はありますか? Linux で特定の名前のファイルを検索したい。名前には修正文字列が含まれる場合がありますが、ホスト名のみが含まれる場合もあります。だから私がやりたいことは次のようなものです:
hostname コマンドの出力を正規表現と何らかの方法で連結できるかどうかはわかりません。前もって感謝します!
string - ワンライナーの変数としてのコマンド置換
次のエラーが表示されます。
.
の前の番号を取得しようとしています
qdel
それをopenPBSの引数として使用して、ログインで開始したすべてのプロセスを削除できるようにしますkigumen
理想的には、これはうまくいくはずです:
これまでのところ、これだけが機能します:
しかし、一時変数のないクリーンなワンライナーが必要です。
shell - bash の $(command) 表記に相当する fish
現在、bash を使用する代わりに魚の殻を試しています。私が魚に相当する表記法を学ぶのに苦労している表記法は、この SOF 投稿$(command)
で説明されている方法と同様です。魚を使ってこれを書くにはどうすればよいですか?評価したいコマンドの前後にバックスラッシュ文字を使用できることに注意してください。ただし、コマンドを評価する古いスタイルであるため、リンクされた投稿や他の投稿はこれを思いとどまらせます。
具体的には、これは魚の構文に変換したいbashコマンドです(シェルの起動中にrbenvを初期化するため):
bash - awk -v はコマンド置換を受け入れますか?
bash コマンド置換技術を使用して、ワンライナーで awk 変数を作成できますか? これが私が試みていることですが、何かが正しくありません。
おそらく、コマンド置換が Awk を使用しているからでしょうか (私はそれを疑っていますが)? それはあまりにも「インセプションっぽい」のではないでしょうか?GNU Awk 3.1.7
bash - コマンド置換は、同じコマンドを単独で実行するよりも多くのサブシェルを生成するのはいつですか?
昨日、bash でコマンド置換を使用すると、不要なサブシェルが生成されることが示唆されました。アドバイスは、このユースケースに固有のものでした:
私が理解できる限り、これはこのユースケースには正しいようです。ただし、これを確認しようとして簡単に検索すると、混乱し矛盾するアドバイスが大量に出てきます。コマンド置換をすべて使用すると、サブシェルが生成されるという一般的な知恵があるようです。例えば:
コマンド置換は、コマンドの出力に展開されます。これらのコマンドはサブシェルで実行され、それらの stdout データは、置換構文が展開されるものです。(ソース)
掘り続けない限り、これは十分に単純に思えますが、掘り下げ続けると、そうではないという提案への参照を見つけ始めるでしょう。
コマンド置換は必ずしも subshell を呼び出すとは限らず、ほとんどの場合は呼び出されません。それが保証する唯一のものは順不同の評価です: 最初に置換内の式を評価し、次に置換の結果を使用して周囲のステートメントを評価します。(ソース)
これは理にかなっているように思えますが、本当ですか? サブシェル関連の質問に対するこの回答man bash
は、次のことに注意してください。
パイプライン内の各コマンドは、個別のプロセスとして (つまり、サブシェル内で) 実行されます。
これは私を主な質問に導きます。正確には、コマンド置換によって、同じコマンドを分離して実行するために、とにかく生成されなかったサブシェルが生成される原因は何ですか?
次のケースを検討し、余分なサブシェルのオーバーヘッドが発生するケースを説明してください。
これらの各ペアは、実行するサブシェルの数が同じですか? POSIX と bash の実装に違いはありますか? コマンド置換を使用するとサブシェルが生成され、同じコマンド セットを単独で実行しても生成されない他のケースはありますか?