IFS=',' /usr/bin/read および IFS=',' 読み取り

IFS=',' /usr/bin/read および IFS=',' 読み取り

コンテキスト

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.$ which read
/usr/bin/read

$ which read
/usr/bin/read

以下の例1は機能しますが、例2は機能しない理由を誰かが説明できますか?

ケース1 - 作品を赤裸々に読む場合

これ:

declare data
data="pig,cow,horse,rattlesnake,"
declare -a my_array
IFS=',' read -r -a my_array <<< "$data"
for item in "${my_array[@]}"; do echo "$item"; done

生産:

pig
cow
horse
rattlesnake

例2 - /usr/bin/readの失敗

これにより出力は生成されません。

declare data
data="pig,cow,horse,rattlesnake,"
declare -a my_array
IFS=',' /usr/bin/read -r -a my_array <<< "$data"
for item in "${my_array[@]}"; do echo "$item"; done

ベストアンサー1

readは、シェル組み込みコマンド、つまり外部プログラムではなくシェル自体が提供するコマンドです。シェル組み込み関数の詳細については、次を参照してください。組み込みコマンドと非組み込みコマンドの違いは何ですか?

readシェルの状態を変更するため、組み込み関数が必要です。特に、出力を含む変数を設定します。外部コマンドは、呼び出されるシェルの変数を設定できません。また、見ることができますCDはなぜプログラムではないのですか?

一部のシステムには、という外部コマンドもありますread議論の余地があるコンプライアンス理由。外部コマンドは、コマンドが実行するすべての操作を実行できません。入力行を読み取ることはできますが、読み取った内容でシェル変数を設定することはできないため、外部コマンドは入力行を処理せずに削除するためにのみ使用できます。

which read組み込み関数が存在するという事実を教えてくれません。なぜならそれがその機能ではないからです。whichそれ自体はbashや他のBourneスタイルのシェル(zshを除く)の外部コマンドなので、外部コマンドに関する情報だけを報告します。電話するのに十分な理由はほとんどありません。which。コマンド名が何を意味するのかを調べるコマンドは次のとおりです。type

bash-5.0$ type read
read is a shell builtin

おすすめ記事