問題タブ [subshell]

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.

0 投票する
2 に答える
780 参照

powershell - コマンド/スクリプトがグローバル環境を変更しないようにする方法

現在の最上位シェルから scriptblocks/scripts を実行する必要があり、グローバル スコープを変更せずに残しておいてください。

これまでのところ、次の可能性しか考えられませんでした。

問題は、それらが非常に遅いことです。

たとえば、次のことができるようにしたいと考えています。

...私のシェルの作業ディレクトリが変更$env:NEW_VARされず、グローバルスコープに設定されないように。

これを達成するための代替手段はありますか?

0 投票する
6 に答える
528 参照

environment-variables - シェルスクリプト内から、それを呼び出したシェルがインタラクティブシェルであるかどうかをどのように判断できますか?

screen対話型シェルから呼び出された場合にのみセッションを開始する(または既存のセッションに再参加する)シェルスクリプトを設定しようとしています。私が見た解決策$-は、文字「i」が含まれているかどうかを確認することです。

ただし、これは失敗します。これは、スクリプトが#!/bin/sh、上部の結果として呼び出される新しい非対話型シェルによって実行されるためです。スクリプトを実行する代わりにソースを作成すると、希望どおりに機能しますが、それは醜いハックです。私はそれを実行するときにむしろそれを動作させたいです。

では、スクリプト内の対話性をどのようにテストできますか?

0 投票する
1 に答える
1065 参照

bash - トラップコードでbashトラップを再度設定するには?

初めて呼び出された後に EXIT トラップによって呼び出される必要がある bash 関数があります。関数は、関数が終了するとすぐにトラップを起動するように再度設定します。

私が抱えている問題は、トラップが 1 回しか実行されない、つまりdoStuff2 回しか実行されないことです。

単純な for ループを使用しない理由は、CPU のサブセットごとに関数doStuff kを実際に 1 回呼び出し、処理が非常に多いため、一度に 1 つのインスタンスのみを CPU で実行したいからです。集中的な。それが私がミューテックスロックを持っている理由でもあります。次に、のインスタンスが返されるとすぐに、次のインスタンスを起動したいと思います(実際、それらはすべて異なるシミュレーションです)。launchNextExperimentdoStuffdoStuffkdoStuff

ネストされたサブシェルごとにトラップが設定され、最終的launchNextExperimentに実行回数がCPU ごとkに 1 つだけであることを確認するにはどうすればよいですか?doStuff

0 投票する
2 に答える
6544 参照

bash - bash のローカル変数: ローカル vs サブシェル

私の知る限り、bash 関数でローカル変数を作成するには 2 つの方法があります。サブシェルを作成するか、すべての変数をローカルとして宣言します。

例えば:

また

明らかに、サブシェルを使用するバージョンは、すべての変数をローカルに宣言することを気にする必要がないため、作成が簡単です ( getoptsなどのツールによって作成/エクスポートされた (環境) 変数は言うまでもありません)。しかし、サブシェルの作成にはオーバーヘッドがあると想像できます。

では、より良いアプローチは何ですか?長所/短所は何ですか?

0 投票する
2 に答える
9623 参照

bash - パイプの左側はサブシェル?

編集:

以下の私のコメント sed 's@^@ @' <(f1)は正しくありませ$BASH_SUBSHELLんが、私たちがローンチと同じレベルにいることを示していますが、変数はメインスクリプトで失われています。代わりにテストしたGordonsの回答に基づいてf1 > >(sed 's@^@ @')おり、それは正しく機能しているようです。それでも、最初のフォームでは BASH_SUBSHELL を 0 ではなく 1 にすべきではないでしょうか?


この小さなテストを検討してください

次の出力で:

(の目的は、sed何かへのパイプを持つことだけです。f1 は stderr に出力されるため、何かを行うとは思わないでください)

関数 f1 は、現在の BASH_SUBSHELL と i の現在の値をログに記録します

スクリプトの最後に が表示される理由はわかっていますi=1。これは、2 番目の呼び出しがサブシェルで行われ、サブシェル 1 の i の値が失われたためです。

私が知らないのは、パイプの左側が現在のシェルで実行されなかった理由です

これを回避できると思ったのですsed 's@^@ @' <(f1) が、左側がメインスクリプトと同じレベルにない理由を知りたいです

0 投票する
6 に答える
39789 参照

bash - サブシェルとサブストリングを使用した Bash の不適切な置換

人為的な例...与えられた

これは機能します(bashで)

これはしません

私の質問は、この [サブシェル置換] が正しく評価されない原因となるルールはどれですか? また、これを 1 ホップで行う正しい方法は何ですか?

0 投票する
1 に答える
6042 参照

bash - bashサブシェルでバックグラウンドジョブとして関数を呼び出すことはできますか?

私がbash関数を持っているとしましょう

サブシェルでバックグラウンドジョブとして関数を呼び出すことはできますか?例えば:

どう思いますか?

0 投票する
2 に答える
1079 参照

bash - リダイレクト (<) がサブシェルを作成しないのはなぜですか

次のコードを書きました

私が理解しているように、パイプ(|)によってサブシェルが作成されるため、1行目の変数varは最後の行で同じ値になります。

ただし、これで解決します:

私の質問は、リダイレクトによってサブシェルが作成されないのはなぜですか、または必要に応じて、パイプによってサブシェルが作成されるのはなぜですか?

ありがとう

0 投票する
1 に答える
819 参照

arrays - Bash:whileループでブレース内に配列を設定しますか? (サブシェルの問題)

通常のインデックス付き配列である variable"${Error[*]}"を、宣言されてからチェックされるまで設定されたままにするのに問題があります。宣言が固執しないように、サブシェルを起動する必要があるように思えます。ブレースを使用すると、サブシェルが開かれるとは思いませんでした{ stuff...; }Error書き込もうとしている場合に備えて、変数を取得する方法を知りたいです。これが私のスクリプトのサンプルです:


xtrace 出力:


cpiozipinfo、およびcab ファイルを処理できないことは 明らかunzipです...エラーを発生させるために、意図的に「cab」を拡張子リストに入れました。

すでに失敗したアーカイバーを繰り返さずに、成功するまで別のアーカイバーでループし続けたいですTestFunction(ファイルリストがダンプされますcabextract。この場合は喜んで行います)。

最後に、これはうまくいくので...

grep...結果をすぐに取得したいので、問題は中括弧であると想定する必要があります。ただし、失敗した場合にのみ結果が表示されないError[run]場合は設定したくないため、そこにそれらのブレースが必要です。他の理由で外にgrepしたくありません(完全に書き直す必要があります)。grepcpioTestFunction

大規模な書き換えなしでこれに対する簡単な解決策はありますか? 多分echo 'cpio'いくつかのfdに行き、read -u6どういうわけかそれをingしますか?

配列をファイルリストに設定してから、すべてのファイルを設定する必要はありません。実際に速度が低下するためですfor loop | grep

0 投票する
3 に答える
5944 参照

bash - パイプラインから読み取る while read ループの後に変数がリセットされる

bzip2ディレクトリ内のすべての.bspファイルを圧縮するために使用するbashシェルスクリプトを作成しています。このスクリプトには、合計 (ファイル、成功した zip、成功した整合性スキャン) をカウントするための変数がいくつかありますが、問題が発生したようです。

およびfind $loc -name "*.bsp"を与えるファイルがなくなると、をゼロに設定し、および(これらはすべて、 内で変更 (増加) されます (中に呼び出されます) または( 内でも呼び出されます)。while readwhile read$filcount$zipcount$scacountinitiate ()bzip ()initiate ()bzipint ()initiate ()

内部で変数が変更されているか、initiate ()そこからアクセスされる他の関数と関係があるかどうかをテストするために、 echo$validを使用しました。initiate ()$filcount$zipcountinitiate ()initiate ()

興味深いことに、$validinitialize 内の他の変数のように 0 にリセットされません。

読み取りが終了しているときに変数が魔法のようにリセットされる理由を誰か教えてもらえますか?