GNU/Linux >> Linux の 問題 >  >> Linux

これが「読み取り中」にターミナルで機能するのに、シェルスクリプトでは機能しないのはなぜですか?

ルートウィンドウのタイトル、つまりxsetroot -name "clever words"を設定することで適用される情報テキストを、WMバーに入力しているときに、この興味深い問題に遭遇しました。

この目的のために、大金を印刷することは端末でうまく機能します:

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読み取りループにどのように影響するかを確認できません。または、ループの反復間でも​​変数が範囲外ですか?

何が足りないのですか?

更新: sh 私が使用したのはダッシュにリンクされており、POSIXに準拠するようになっています。より由緒あるbashを使用する これを解決しました。

承認された回答:

bashで最初の例を実行しているようです 、および/bin/shが指すものの2番目 、これは、入力を入れたい変数を指定する引数を渡す必要があるPOSIXシェルです。シバンを#!/bin/bashに変更します これを修正する必要があります。


Linux
  1. 正規表現がXで機能するのに、Yでは機能しないのはなぜですか?

  2. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  3. スクリプトは実行可能であるが読み取り可能ではありませんか?

  1. BashスクリプトのRmコマンドは変数では機能しませんか?

  2. ファイルが存在する場合にforループの`zip`が機能するのに、存在しない場合は機能しないのはなぜですか?

  3. ヒアドキュメントの親シェルがダッシュのサブコマンドでは機能しないのに、Bashは機能するのはなぜですか?

  1. bashスクリプトを終了する方法はありますが、ターミナルを終了しない

  2. Tomcat がポート 8080 で動作するのに 80 で動作しないのはなぜですか?

  3. Chrome デベロッパー ツールで JavaScript を編集できないのはなぜですか?