ルートウィンドウのタイトルを設定して適用される情報テキストを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:read:arg count
もちろん、これは私たちの運命の結果を変数に割り当て、次にその変数でxsetrootを使用することによって修正されます。しかし、これがスクリプトで機能しない理由を理解したいと思います。
パイプラインのいずれかの側の各コマンドはそれ自体のサブシェル内で実行されることを理解していますが、ローカライズされた変数がwhile読み取りループにどのように影響するかを確認できません。または、ループの反復間でも変数がスコープ外ですか?
何が欠けていますか?
更新:使用したsh
Iはダッシュにリンクされていますが、これはPOSIX準拠にされる過程にあります。より由緒あるものを使用してbash
これを解決しました。
read
:変数なしで呼び出し可能であることpubs.opengroup.org/onlinepubs/9699919799/utilities/read.html