「読んでいる間」この端末では動作しますが、シェルスクリプトでは機能しないのはなぜですか?

「読んでいる間」この端末では動作しますが、シェルスクリプトでは機能しないのはなぜですか?

ルートウィンドウのタイトルを設定して、適用された情報テキストでWMバーを埋めると、この興味深い問題に直面しました。xsetroot -name "clever words"

これを行うには、ターミナルから占いを印刷することが有効です。

fortune -s | while read -r; do xsetroot -name "$REPLY"; done

ただし、シェルスクリプトで実行すると同じエラーが発生します。

#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done

生産:

$ sh afilereader
afilereader: 2: 読み取り: 引数の数

もちろん、これは負の結果を変数に割り当て、その変数とxsetrootを使用して解決できます。しかし、私はまだ理解したいです。なぜこれはスクリプトでは機能しません。

パイプの両側の各コマンドが独自のサブシェルで実行されることはわかっていますが、そのローカライズされた変数がwhile readループにどのような影響を与えるかを判断することはできません。それとも、ループ反復の間でも変数が範囲外ですか?

私が逃したものは何ですか?

修正する:私がsh使用するリンクはPOSIXと互換性のあるダッシュです。より尊敬される人々を活用することでbash問題は解決します。

ベストアンサー1

実行中のように見える最初の例bashと指す内容の2番目の例/bin/shはPOSIXシェルで、入力を入れる変数を指定する引数を渡す必要があります。 Shebangを次に変更すると#!/bin/bash問題が解決します。

おすすめ記事