個々のコマンド/組み込み範囲に対してカスタム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
上記の分割は、zsh
IFSがフィールドセパレータではなくフィールドセパレータである他のシェルを除いては無効です。)
IFS=$'\n' a=($str)
a=1 b=2
.
メモvar=value cmd
:
存在する:
var=value cmd arg
シェルは/path/to/cmd
新しいプロセスで実行され、incmd
とarg
inargv[]
とvar=value
inを渡しますenvp[]
。これは実際には変数の代入ではなく、環境変数を渡す以上のものです。処刑された注文する。 BourneまたはKornシェルでもset -k
作成できますcmd var=value arg
。
今これは非です処刑された。 Bourneシェルでは、aloneと同様にinが最終的に設定されvar=value some-builtin
ます。これは、例えば(無駄な)動作が組み込みかどうかに応じて変化することを意味する。var
var=value
var=value echo foo
echo
POSIXおよび/またはksh
Bourneの動作は次のクラスでのみ発生するため、これを変更しました。特殊組み込み機能。eval
特殊内蔵型ですread
。いいえ。特別でない組み込みコマンドの場合は、組み込みコマンドの実行のみが設定され、var=value builtin
外部var
コマンドの実行と同様に動作します。
このcommand
コマンドは削除に使用できます。特別なその属性特殊組み込み機能。 POSIXが無視することは、組み込み関数の場合、eval
シェルが変数スタックを実装する必要があることを意味します(コマンドを指定したりスコープを指定しなくても)。なぜなら、次のことができるからです.
。local
typeset
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
でも:
a=1 command eval myfunction
使用、設定、呼び出すことができる関数ですmyfunction
。$a
command eval
(AT&Tはまだそれを実装していません)(AT&Tはまだ実装していません)ksh
(仕様はほとんどに基づいています)しかし、今、これら2つを除くほとんどのシェルは実装しているので、これは実際に監督でした。他のシェルは異なる動作をします。たとえば、次のようになります。ksh
zsh
a=0; a=1 command eval a=2; echo "$a"
しかし。これをサポートするシェルで使用することは、local
ローカルスコープを実装するより信頼性の高い方法です。