タグ付けされた質問 「subshell」

2
括弧は本当にコマンドをサブシェルに入れますか?
私が読んだことから、コマンドを括弧で囲むと、スクリプトを実行するのと同様に、サブシェルで実行されるはずです。これが当てはまる場合、xがエクスポートされていない場合、変数xはどのように見えますか? x=1 (echo $x)コマンドラインで実行すると1になります echo $x期待どおり、スクリプトで実行しても何も起こりません

3
$()はサブシェルですか?
サブシェルの構文がであると理解していますが(<commands...>)、$()変数値を取得できるサブシェルにすぎませんか? 注:これは、ドキュメントのさまざまな表現に基づいてbash 4.4に適用されます。
51 bash  subshell  syntax 

4
なぜ(exit 1)スクリプトを終了しないのですか?
スクリプトがありますが、必要なときに終了しません。 同じエラーのスクリプトの例は次のとおりです。 #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' 私は出力を見ると仮定します: :~$ ./test.sh 1 :~$ しかし、私は実際に見ます: :~$ ./test.sh 1 2 :~$ ()何とか連鎖するコマンドは、スコープを作成しますか?exitスクリプトではない場合、何が終了しますか?

3
中括弧を使用したBashサブシェルの作成
よれば、この、中括弧の間のコマンドのリストを確定すると、リストは、現在のシェルのコンテキスト内で実行されるようにします。サブシェルは作成されません。 psこれを実際に使用して見る これは、コマンドラインで直接実行されるプロセスパイプラインのプロセス階層です。4398は、ログインシェルのPIDです。 sleep 2 | ps -H; PID TTY TIME CMD 4398 pts/23 00:00:00 bash 29696 pts/23 00:00:00 sleep 29697 pts/23 00:00:00 ps コマンドラインで直接実行される中括弧間のプロセスパイプラインのプロセス階層に従います。4398は、ログインシェルのPIDです。これは、すべてが現在のシェルコンテキストで実行されることを証明する上記の階層に似ています。 { sleep 2 | ps -H; } PID TTY TIME CMD 4398 pts/23 00:00:00 bash 29588 pts/23 00:00:00 sleep 29589 pts/23 00:00:00 ps これは、sleepパイプライン自体が中かっこ内に配置されている場合のプロセス階層です(つまり、2レベルのかっこ) { …
31 bash  subshell 

6
サブシェルからシェルスクリプトを終了する
このスニペットを検討してください。 stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } 通常、funcが呼び出されると、スクリプトが終了します。これは意図した動作です。ただし、次のようなサブシェルで実行される場合 result=`func` スクリプトは終了しません。つまり、呼び出しコードは毎回関数の終了ステータスをチェックする必要があります。これを回避する方法はありますか?これは何のset -eためですか?

3
サブシェルにいるかどうかを検出するにはどうすればよいですか?
exitビルトインの機能を置き換える関数を作成して、端末を終了できないようにしています。 SHLVL環境変数を使用しようとしましたが、サブシェル内では変更されないようです: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 私の機能は次のとおりです。 exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } exitただし、これによりサブシェル内で使用することはできません: $ exit Nice try! $ (exit) Nice try! 私がサブシェルにいるかどうかを検出する良い方法は何ですか?
24 bash  shell  exit  subshell 

3
Bashでサブシェルを呼び出すためのルールは?
サブシェルを作成するためのBashルールを誤解しているようです。かっこは常に独自のプロセスとして実行されるサブシェルを作成すると考えました。 しかし、これはそうではないようです。コードスニペットA(下記)では、2番目のsleepコマンドは別のシェルで実行されません(pstree別の端末で決定されます)。ただし、コードスニペットBでは、2番目のsleepコマンドは別のシェルで実行されます。スニペットの唯一の違いは、2番目のスニペットが括弧内に2つのコマンドを持っていることです。 誰かがサブシェルを作成するときのルールを説明してもらえますか? コードスニペットA: sleep 5 ( sleep 5 ) コードスニペットB: sleep 5 ( x=1 sleep 5 )

3
このスクリプトは、それ自体の1つのインスタンスのみが実行されていることをどのように確認しますか?
2013年8月19日に、Randal L. Schwartzはこのシェルスクリプトを投稿しました。これは、Linux上で、「[スクリプト]の1つのインスタンスのみが実行され、競合状態やロックファイルのクリーンアップなし」を保証することを目的としています: #!/bin/sh # randal_l_schwartz_001.sh ( if ! flock -n -x 0 then echo "$$ cannot get flock" exit 0 fi echo "$$ start" sleep 10 # for testing. put the real task here echo "$$ end" ) < $0 宣伝どおりに動作するようです: $ ./randal_l_schwartz_001.sh & ./randal_l_schwartz_001.sh [1] 11863 11863 start …

2
サブシェルで変数が表示されるのはなぜですか?
Learning Bash Bookでは、サブシェルは環境変数とファイル記述子などのみを継承し、エクスポートされない変数は継承しないと述べています。 $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ 私が知っているようにシェルがために2つのサブシェルが作成されます()とのために./file、なぜに()ケースを識別サブシェルんvarそれはエクスポートされませんが、変数をし、中./fileケース、それはそれを識別しませんでしたか? # Strace for () clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617 # Strace for ./file clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631 私が使用しようとstrace、この問題が発生したかを把握すると、驚くほど私はbashがクローンシステムコールのために同じ引数を使用します見つけ、中にフォークプロセスの両方、この手段はそう()と./file、親の同じプロセスアドレス空間を持つ必要があり、なぜこの()場合、変数はサブシェルに表示され./file、同じ引数はクローンシステムコールに基づいていますが、同じことはケースに起こりませんか?
18 bash  shell  subshell 

1
zshでは、cat <(cat)vs cat | cat vs cat =(cat)?
私は同じことcat &lt;(cat)をcat | catすることを期待しました:stdinからstdoutに行をコピーします。私の理解では、両方がcatサブシェルでa を実行し、サブシェルcatのstdoutを一時的な名前付きパイプにcatリダイレクトしてから、stdinをパイプにリダイレクトして現在のシェルで別のシェルを実行します。 代わりに、cat &lt;(cat)端末で入力できますが、入力行はコピー^Dされず、シグナルを送信できませんEOF。cat | cat期待どおりに動作します。 さらなる実験として、にcat =(cat)似た問題があるかどうかを確認cat &lt;(cat)しました^Dが、期待どおりに動作します。aまでのすべてのstdin が一度にstdoutにコピーされます。 誰もzshがボンネットの下で何をしているのかを理解するのを助けることができますか?

7
並列バックグラウンドプロセス(サブシェル)の終了コードを収集する
次のようなbashスクリプトがあるとします。 echo "x" &amp; echo "y" &amp; echo "z" &amp; ..... echo "Z" &amp; wait サブシェル/サブプロセスの終了コードを収集する方法はありますか?これを行う方法を探していますが、何も見つかりません。これらのサブシェルを並行して実行する必要があります。そうでなければ、これは簡単です。 汎用的なソリューションを探しています(並行して実行するサブプロセスの数が不明/動的です)。

5
これはbashのバグですか?`return`はパイプから呼び出されても関数を終了しません
私は最近bashでいくつかの奇妙な問題を抱えています。スクリプトを簡素化しようとしている間に、この小さなコードを思いつきました。 $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 return印刷せずに関数を終了する$?必要がありますか?それでは、パイプから単独で戻ることができるかどうかを確認しました。 $ echo | while read -r; do return 1; done bash: return: can only `return' from a function …

5
ステートフルbash関数
呼び出しごとにカウントを増やす(そして返す)Bashの関数を実装したいと思います。残念ながら、サブシェル内で関数を呼び出しているため、親シェルの変数を変更できないため、これは簡単ではないようです。 これが私の試みです: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } これは次のように使用されます(したがって、サブシェルから関数を呼び出す必要があります)。 PS1='$(ps_count_reset)&gt; ' PS2='$(ps_count_inc) ' そうすれば、番号が付いた複数行のプロンプトが表示されます。 &gt; echo 'this 1 is 2 a 3 test' 可愛い。しかし、上記の制限のために機能しません。 機能しない解決策は、変数ではなくファイルにカウントを書き込むことです。ただし、これにより、同時に実行される複数のセッション間で競合が発生します。もちろん、シェルのプロセスIDをファイル名に追加することもできます。しかし、多くのファイルでシステムが乱雑にならないより良い解決策があることを願っています。

3
「サブシェル」と「子プロセス」の正確な違いは何ですか?
これとこれによれば、サブシェルは括弧を使用して開始されます(…)。 ( echo "Hello" ) これ、これ、およびこれによれば、コマンドが&amp; echo "Hello" &amp; Posix仕様では、subshellこのページの単語を使用していますが、このページでは定義されていません。また、同じページでは、「子プロセス」も定義されていません。 両方ともfork()正しいカーネル機能を使用していますか? いくつかのフォークを「サブシェル」と呼び、他のフォークを「子プロセス」と呼ぶ正確な違いは何ですか。
16 bash  shell  subshell 

3
トラップはサブシェルに継承されますか?
私は次のスクリプトを試しました: #!/bin/bash trap 'echo "touching a file" &amp;&amp; touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo 上記のスクリプトの出力は次のとおりです。 [root@usr1 my_tests]# ./test.sh foo1 foo touching a file ただしfoo1、サブシェルで呼び出されるトラップも終了時に呼び出されることを期待していました。 これは予想されますか? さtrapサブシェルによって継承されましたか? はいの場合、どのような場合にtrapサブシェルに継承されますか?
14 shell  trap  subshell 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.