単一ステートメントの IFS 設定

単一ステートメントの IFS 設定

個々のコマンド/組み込み範囲に対してカスタムIFS値を設定することが可能であることがわかります。個々の明細にカスタムIFS値を設定する方法はありますか?明らかにそうではありません。これは、次のようにすると、この操作を試みるとグローバルIFS値が影響を受けるためです。

#check environment IFS value, it is space-tab-newline
printf "%s" "$IFS" | od -bc
0000000 040 011 012
             \t  \n
0000003
#invoke built-in with custom IFS
IFS=$'\n' read -r -d '' -a arr <<< "$str"
#environment IFS value remains unchanged as seen below
printf "%s" "$IFS" | od -bc
0000000 040 011 012
             \t  \n
0000003

#now attempt to set IFS for a single statement
IFS=$'\n' a=($str)
#BUT environment IFS value is overwritten as seen below
printf "%s" "$IFS" | od -bc
0000000 012
         \n
     0000001

ベストアンサー1

一部のシェル(含むbash)では:

IFS=: command eval 'p=($PATH)'

(sh / POSIXエミュレーションではない場合はbash省略できますcommand。)しかし、これは引用符なしの変数を使用する場合にも必要であり、ほとんどset -fのシェルにはローカルスコープはありません。

zshを使用すると、次のことができます。

(){ local IFS=:; p=($=PATH); }

$=PATHこれは基本的に行われない単語分割を強制することです(変数拡張にはワイルドカードもないため、shシミュレーションを除いて必要ありませんzsh)。set -f

しかしzsh$pathバンドルまたは$PATH区切り記号に分割:p=(${(s[:])PATH})またはp=("${(s[:]@)PATH}")空の要素を保持します。

(){...}(またはfunction {...})と呼ばれる。匿名関数通常、ローカル範囲を設定するために使用されます。関数ローカルスコープをサポートする他のシェルについても同様のことができます。

e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'

POSIX シェルで変数とオプションのローカル範囲を指定するには、次の関数を使用することもできます。https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh。その後、次のように使用できます。

. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'

(ところで、$PATH上記の分割は、zshIFSがフィールドセパレータではなくフィールドセパレータである他のシェルを除いては無効です。)

IFS=$'\n' a=($str)

a=1 b=2.

メモvar=value cmd:

存在する:

var=value cmd arg

シェルは/path/to/cmd新しいプロセスで実行され、incmdarginargv[]var=valueinを渡しますenvp[]。これは実際には変数の代入ではなく、環境変数を渡す以上のものです。処刑された注文する。 BourneまたはKornシェルでもset -k作成できますcmd var=value arg

今これは非です処刑された。 Bourneシェルでは、aloneと同様にinが最終的に設定されvar=value some-builtinます。これは、例えば(無駄な)動作が組み込みかどうかに応じて変化することを意味する。varvar=valuevar=value echo fooecho

POSIXおよび/またはkshBourneの動作は次のクラスでのみ発生するため、これを変更しました。特殊組み込み機能eval特殊内蔵型ですread。いいえ。特別でない組み込みコマンドの場合は、組み込みコマンドの実行のみが設定され、var=value builtin外部varコマンドの実行と同様に動作します。

このcommandコマンドは削除に使用できます。特別なその属性特殊組み込み機能。 POSIXが無視することは、組み込み関数の場合、evalシェルが変数スタックを実装する必要があることを意味します(コマンドを指定したりスコープを指定しなくても)。なぜなら、次のことができるからです.localtypeset

a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a

でも:

a=1 command eval myfunction

使用、設定、呼び出すことができる関数ですmyfunction$acommand eval

(AT&Tはまだそれを実装していません)(AT&Tはまだ実装していません)ksh(仕様はほとんどに基づいています)しかし、今、これら2つを除くほとんどのシェルは実装しているので、これは実際に監督でした。他のシェルは異なる動作をします。たとえば、次のようになります。kshzsh

a=0; a=1 command eval a=2; echo "$a"

しかし。これをサポートするシェルで使用することは、localローカルスコープを実装するより信頼性の高い方法です。

おすすめ記事