問題タブ [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.
bash - シェルスクリプト、サブシェル、サブスクリプト、パイプ - WEIRD (?) CTRL+C SIGNAL PROPAGATION
そのため、bash スクリプトの奇妙な動作を特定しました。
テストスクリプトは次のとおりです。
ご覧のとおり、サブシェルを作成する括弧を使用して、ロギング目的で出力を簡単にパイプします。
このサブシェル内で、ctrl+c シグナルをキャッチしてスクリプトを終了するスクリプトを実行します。
したがって、サブシェルの出力をパイプするかどうかによって、添え字 (sleep 10) 中に ctrl+c を押したときの動作が異なります。
|で tee -a /tmp/$$.logの場合、出力は次のようになります。
パイプとティーがない場合、出力は次のようになります。
誰かがこの動作を説明できますか? 添字の最後がパイプとティーでそのようにスキップされないようにする方法はありますか?
ありがとう
bash - 複数のコマンドを1つのコマンドにパイプする
複数のコマンドの標準出力を1つのコマンドにパイプするにはどうすればよいですか?
例1:3つすべてのechoコマンドの出力を組み合わせて並べ替えます。
必要な出力:
例2:一時ファイルにリダイレクトせずに、パイプを使用してすべてのコマンドが単一のコマンドラインに含まれるように、次のように書き直します。
bash - 「kill0」を使用せずに、Bashの特定のサブシェルレベルですべてを終了するにはどうすればよいですか?
コンテクスト:
私が持っていると言う:
私は外側のサブシェルを持っています(1つである必要はありません。コマンドグループにすることも、完全に削除することもできます)。その中に、同時に呼び出される2つのパイプ接続されたコマンドグループがあります。両方のグループの実行を開始し、最初のグループが終了したら(2番目のグループはまだ実行中です)、行がある場所で外側のサブシェルのsleep
実行を停止します。#die, somehow
質問:
#die, somehow
行に到達すると、レベル内のすべてが#outer subshell
終了し、その後も実行が継続される(つまりout
、印刷される)ようにするにはどうすればよいですか?
私が試したこと:
1つの解決策はkill 0
、両方の内部コマンドグループから抜け出すために(現在のプロセスグループ内のすべてを強制終了する)を使用することですが、そうするとecho "out"
決して起こりません。外側のサブシェルだけでなく、グループ全体が殺されます。
unset
また、関数を一時的にオーバーライドしてからオーバーライドしようとしましexit
たが、それは問題を別の場所にプッシュしているようです。おそらく私はそれを間違っています。私は決してBashの第一人者ではありません。
なんで?
&
プロセスをフォークアウトするために使用することは私のシステム(* nixに埋め込まれている)では決定論的に機能しないため、あまり詳細に立ち入ることなく、奇妙なサブシェル接続コマンドグループが必要です。その結果、パイプ接続されたグループは、do_first_thing
実行時間が長すぎる場合(上記の例では10秒)にdo_second_thing
発生することを保証します。実際のユースケースはかなり複雑ですが、これが問題の根本です。
乾杯!
bash - ssh を実行するために sed で二重のバックスラッシュを使用するのはなぜですか?
Gentoo Linux の wiki で、動的 jumphost リストに関する次の記述に出くわしました。
sed
動作しますが、式を完全 に理解したいと思います。
元のリファレンスを読んで、Host *+*
パターンを使用して、コマンドの再帰呼び出しをよく理解することができました。しかし、2 つの質問があります。
- 式は を使用し
%%
ます。理由を確認するために を使用ssh -v
したところ、ssh
クライアントが を解析する$HOME/.ssh/config
と、最初の%
が取り除かれているように見えることがわかりました。上記を確認しようとして、openssh のソース コードをダウンロードしましたがreadconf.c
、手がかりが得られませんでした。私は OpenSSH ソース コードを初めて使用しますが、デバッグ情報を使用してコンパイルすることを恐れませんgdb
。それにもかかわらず、私の推測を確認するためのより迅速な方法があれば、ヒントをいただければ幸いです。 また、次の
ssh -v
ことも明らかにしました。つまり、サブシェル
\(
で a を使用してエスケープされるようになりました。\
なぜこれが必要なのですか?
ありがとう、
――ザック
alias - tcshを調達するxargsのエイリアス
エイリアスを使用するxargsコマンドを実行しようとしています。検索はこれを思いついた
しかし、それは戻ります
バリエーションが返されます
bash - 関数内のサブシェルは、別の関数から呼び出されたときに基本的な bash コマンドを見つけることができません
次の bash スクリプトがあります (これは、より複雑なスクリプトの簡略化されたバージョンです)。
実行すると、次の出力が得られます。
chmod
関数が直接呼び出された場合はexecute
機能しますが、別の関数から呼び出された場合は失敗しますが、デバッグ出力はまったく同じように見えます...
誰でもこの動作を説明できますか?
ruby - 戻るのを待たずに ruby からサブプロセスを実行する
重複の可能性:
Ruby でバックグラウンド プロセスを生成する
これを突っついて数日過ごしました。最近までOSからruby1.8.7を使っていました。バッククォートでサブシェルを呼び出します。サブシェルは、stdout と stderr の両方を閉じた状態でバックグラウンドで任意のプログラムを実行する bash ラッパーでした。その後、disown を実行して init にプロセスを引き継がせ、すぐに復帰しました。これは何年もうまく機能し、このループプロセスがバックグラウンドでジョブを開始し、すぐに「はい、実行されました。それだけです」と報告しました。
すべてをrvm 1.9.3にアップグレードしましたが、このトリックを除いてすべて問題ありません。認めたくないというよりも、ハッキングではないかと疑い始めています。1.9.3 では、そのサブシェルを生成すると常に EPIPE エラーが発生します。パイプが壊れているとのことです。私が 1.8.7 で行っていたことはちょっとひどいように思えるので、1.9.3 では機能しないことを受け入れることができます。
system コマンドを使用してみましたが、open3:popen2 を試しました。彼らはまた、disown ラッパーを呼び出して私と一緒に EPIPE を投げます。
これは disown ラッパーです。Rubyには次のようなものがあります
そして、これが実行されると、スローされます
(ゼロ) 出力を r 変数に代入しない場合、効果は同じです。システム関数と Open3:popen2 を使用します。
したがって、私の目標は、コマンドが戻ってくるのを待たずに、単純に ruby からコマンドを実行することです。数時間かかりますが、追跡する必要はありません。スポーンするだけです。ruby がもはやこれを行うことができないように聞こえ始めた場合、または私の disown ラッパーがあまりにも凶悪で承認を得ることができない場合は、ワーカー スレッド プールを試すかもしれません。Ok。ありがとう。
*編集: すばらしい回答をありがとうございます。キャスパーは、私がルビー用語をもっとうまく扱えていれば、おそらくこれに焦点を合わせていたであろうことを教えてくれたと思います. これが少し歩行者である場合は申し訳ありません。皆さん、素早い回答に感謝します!
bash - bashでのerrexitの問題
私はbashスクリプトを書いていますが、最初のエラーでクラッシュさせたいのですが。ただし、以下で簡略化した特定の状況では、これを実行することはできません。
予想される動作は、bad_command
サブシェルのクラッシュ、()
サブシェルのクラッシュへの伝播、外部シェルのクラッシュへの伝播です。しかし、これらはいずれもクラッシュせず、両方のNOが出力されます(!?)
ステートメントのコメントを外すとexit 1
、NOは出力されなくなりますが、NOOはまだ出力されます(!?)
3つのシェルのそれぞれの内部で明示的に使用してset -e
みました(関数の最初の行、後の最初のステートメント(
ですが、変更はありません。
注:()
これはより複雑なスクリプトを単純化したものであるため、サブシェル内でパイプを実行する必要があります。サブシェルがないと、すべてが期待どおりに機能し、またはのいずれか()
でNOは発生しません。false
exit 1
ruby - 親を殺さずにサブシェルでルビーを終了する
次のコマンドでRubyprogramBを呼び出すRubyprogramAがあります。
特定の条件下で、programBにその操作(および関連するサブシェル)を終了させたいが、programAが次のパラメーターのセットに進むことを許可したい。
ただし、exit()
サブシェルabort()
と親の両方Process.kill("SIGTERM",0)
を強制終了すると、programBで作業できなくなります(残念ながら、これはWindows上にあります)。私はruby1.9.2を実行しています。
programAを強制終了せずにprogramBを終了するにはどうすればよいですか?
bash - bash スクリプトは起動時に機能しますが、ターミナルでは機能しません
Amazon ec2 でサーバーを作成し、bash スクリプトをユーザーデータとして渡しています。これは、サーバーの最初の起動時に実行されます。ここで与えられた回答を使用して、ユーザーの crontab に行を追加するコマンドが含まれています。
このスクリプトは、エラー メッセージを表示せず、cronjob が crotab にインストールされているため、起動時に正常に動作しているように見えます。
ただし、サーバーのアップグレード中にもスクリプトを実行したいと思います。コマンド ラインからスクリプトを実行しようとすると、次のエラーが表示されます。
このエラーを修正するには何が必要ですか?