パラメータリストと3つのプロセスがあります。
bash_script -> child -> grandchild
パラメータリストはSun Tzu用です。 3 つのプロセスをすべて変更できます。祖父スクリプトは独自にパラメータを取得します。
以下は、残りのパラメータを孫に渡す正しい方法ですか?
#!/usr/bin/env bash
# This is the grandfather
first_arg="$1"
shift 1;
export MY_ARGS="$@"
後で、次のように孫プロセスを呼び出すコマンドの一部として、子プロセスの環境変数を「伝播」します。
grandchild --foo "$MY_ARGS" # append $MY_ARGS as arguments to foo
答え1
スクリプト内の配列を文字列にダウングレードしないでください。環境変数とその値は単純なkey=value
ペアです。ここで、およびkey
はvalue
両方とも文字列です。接続を介して位置パラメータを単純な文字列に減らすと、それらを別々に保持するのが難しく、最終的に使用しようとすると正しく参照するのが難しくなります。
代わりに、コマンドラインの次のスクリプトに渡したい場所引数(コマンドライン引数)を渡してください。
#!/bin/bash
first_arg=$1
shift
# later ...
./my_other_script "$@"
他のスクリプトでは:
#!/bin/bash
# use "$@" here
foo --bar "$@"
答え2
編集:bashから配列をエクスポートできないようです。配列などを設定する関数をエクスポートする必要があります。
配列を使用する必要があります。それ以外の場合は、空白の引数が複数の単語に展開されます。
export MY_ARGS=("$@")
foo --bar "${MY_ARGS[@]}"
答え3
なぜ人々がこの質問によって混乱しているのかはよくわかりませんが、おそらく質問が混乱していて、これが私に役立つようです。
my_args_array=("$@")
export MY_ARGS="${my_args_array[@]}"
次に、MY_ARGS
次のように使用します。
foo --bar $MY_ARGS
ノート@Kusalanandaが指摘したように:これは失敗する元のパラメータにスペースがある場合。この場合、子$@
プロセスを介してパラメータを渡すのではなく、環境変数を使用することをお勧めします。
答え4
一般的な答えはこれです。以下を使用してパラメータを渡すことができます。
- コマンドライン位置パラメータ
- 環境変数
- オペレーティングシステムで利用可能なすべてのIPC(プロセス間通信)
最初の2つに集中してください。
- 位置パラメータは最も自然な方法です。これには、
"$@"
現在定義されているすべての位置パラメータの可能な編集と追加の転送が含まれます。これはプロセス階層のすべての段階で行う必要があります。 環境変数はキーと値のペアの形で提供されるため、位置パラメータほど単純ではありません。このように値を渡しても値を取得するにはキーが必要です。それが唯一の環境変数でない限り、十分な考慮がなければ仮定しません。しかし、この方法は可能です。あなたがしなければならないのは、利害関係者間で鍵を共有することだけです。キー自体はパターンに基づくことができます。これを行う方法の例は次のとおりです。
p.bash
2つのスクリプトがありますc.bash
。p
親のために、しかしc
子供のために。仲介者が環境を介して送信された値を削除しない限り、仲介者によって分離できます。簡単にするために、両方のスクリプトはp.bash
呼び出しから直接接続されますc.bash
。これは
p.bash
:#!/bin/bash shift #consume the first argument #parse and export the other arguments prefix=abcdef_ i=0 for a in "$@"; do export "$prefix""$i"="$a" ((i++)) done ./c.bash
これは
c.bash
:#!/bin/bash #consume the env arguments prefix=abcdef_ env | grep ^"$prefix"
実行は次のとおりです。
$ ./p.bash arg "1 2" "3 4" "5 6" abcdef_0=1 2 abcdef_1=3 4 abcdef_2=5 6
各スクリプトにつき 2 行ずつ説明します。
最初は発電機です。
export "$prefix""$i"="$a"
export
abcdef_0
などの形式で変数を使用して環境を埋めますabcdef_1
。これで、子プロセスはその環境でそれを見つけることができます。 (一部ブローカーがリセットしない限り)env | grep ^"$prefix"
子供たちは消費者です。env
環境変数をリストし、関連するトランスポートgrep
を担当するプレフィックスに関連付けられていない行をフィルタリングします。ここで何が起こっているのかを理解したら、送信された変数にアクセスして子プロセスで利用できるようにする必要があります。