<<を使用するときにサブシェル内で変数を設定する

<<を使用するときにサブシェル内で変数を設定する

次の方法を使用して、「newgrp」によって開始されたサブシェルにコマンドを渡します。

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"

サブシェルで何も「設定」しない限り、うまくいきます。

つまり

#!/bin/csh
echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
set a=npy
echo $a
id
EONG
echo "After newgrp"

上記のように、サブシェルにa = npyを設定してecho $ aを実行すると、npyが返されるはずです。ところで、aが宣言されていないため、エラーが発生します。

誰かが使用するときにサブシェル内に環境変数を設定する方法を教えてもらえますか?<<

ベストアンサー1

この<<構成はシェルを導入しますここのドキュメント読み取り時に二重引用符で囲まれた文字列として扱われるため、シェルから読み取ると変数はすぐに拡張されます。変数が定義されていないことを示すシェル機能を有効にすると、これを明確に確認できます。ここでは、BASHシェルでこの関数を使用します。

$ set -o nounset
$ echo "$a"
bash: a: unbound variable
$ bash <<EOF
> a=foo
> echo "$a"
> EOF
bash: a: unbound variable

このドキュメントを読むときにシェルが変数を拡張するのを防ぐために、単一引用符またはバックスラッシュを使用できます。すべて 使用すべて変える:

$ bash <<'EOF'
> a=foo
> echo "$a"
> EOF
foo

$ bash <<EOF
> a=foo
> echo "\$a"
> EOF
foo

ここで文書内で変数の周りに使用される引用符の種類は、ここで文書を読み取るときに変数がシェルによって拡張されるかどうかには関係ありません。

メモ予期しないGLOBファイル名の一致が発生しないように、変数の拡張子を常に二重引用符で囲んでください。

ポリフェニレンスルフィド入力エラーをキャッチするには、シェルで未定義の変数チェックをオンにします。これにより、問題のアイデアを得ることができます。

ピアツーピアスクリプトに C シェルを使用しないでください。 その人は間違いが多い そして矛盾

おすすめ記事