コンテキスト
$ 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