20

kshには、これを行うための非常に興味深い構造があり、この回答で詳しく説明しています: https://stackoverflow.com/a/11172617/636849

Bash 4.0 以降、この問題を解決する組み込みのmapfile組み込みコマンドがあります: http://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html

しかし、奇妙なことに、プロセス置換では機能しないようです:

foo () { echo ${BASH_SUBSHELL}; }
mapfile -t foo_output <(foo) # FAIL: hang forever here
subshell_depth=${foo_output[0]} # should be 0

しかし、Bash v3.2 でこれを行う方法は?


そのようにサブクラスを使用することは本当に可能ですか? 私は次のようなことをしたでしょう:

.my-container [class^="col-md"] .my-inner {
      padding : 10 px;
      background-color: #eee;
      .... etc...
}

...何を達成しようとするかによって異なります。

4

4 に答える 4

18

これは、別の答えを保証するほど十分に異なる別の方法です。この方法はサブシェルフリーで、bash サブプロセスフリーだと思います:

ubuntu@ubuntu:~$ bar () { echo "$BASH_SUBSHELL $BASHPID"; }
ubuntu@ubuntu:~$ bar
0 8215
ubuntu@ubuntu:~$ mkfifo /tmp/myfifo
ubuntu@ubuntu:~$ exec 3<> /tmp/myfifo
ubuntu@ubuntu:~$ unlink /tmp/myfifo
ubuntu@ubuntu:~$ bar 1>&3
ubuntu@ubuntu:~$ read -u3 a
ubuntu@ubuntu:~$ echo $a
0 8215
ubuntu@ubuntu:~$ exec 3>&-
ubuntu@ubuntu:~$

ここでのトリックはexec、FD を使用して読み取り/書き込みモードで FIFO を開くために使用することです。これには、FIFO を非ブロックにするという副作用があるようです。次に、コマンドをブロックせずに FD にリダイレクトしてから、FD を読み取ることができます。

FIFO はおそらく 4K 程度の限られたサイズのバッファになるため、コマンドがこれよりも多くの出力を生成すると、再びブロックされることに注意してください。

于 2014-02-07T20:15:24.020 に答える
3

最も簡単な方法は、関数を削除して変数を直接渡すことです。たとえば、次のようになります。

declare -a foo_output
mapfile -t foo_output <<<${BASH_SUBSHELL}
subshell_depth=${foo_output[0]} # Should be zero.

それ以外の場合は、関数で次の 2 つの項目が指定されます。

foo () { echo "$BASH_SUBSHELL $BASHPID"; }

次のコマンドのいずれかのようにread(必要に応じて変更して)使用できます。IFS

cat < <(foo) | read subshell_depth pid # Two variables.
read -r subshell_depth pid < <(foo) # Two separate variables.
read -a -r foo_arr < <(foo) # One array.

またはreadarray/を使用mapfile(Bash >4):

mapfile -t foo_output < <(foo)
readarray -t foo_output < <(foo)

次に、出力を配列に変換します。

foo_arr=($foo_output)
subshell_depth=${foo_arr[0]} # should be 0
于 2016-02-27T15:03:28.183 に答える