grep は bash スクリプトでは動作しますが、ターミナルでは動作しません

grep は bash スクリプトでは動作しますが、ターミナルでは動作しません

端末の動作がおかしくなります。

次のコマンドは端末に何も出力しません。

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

まったく同じコマンド、同じ構文が bash スクリプト内で完全に機能します。

通常、私は反対の行動について不満を言う人々を見かけます。

上記の操作は何百もの方法で実行できることはわかっていますが、上記のコマンドが私の端末で動作しない理由がわかりません。

一方、次のコマンドはターミナルとスクリプトの両方で正常に動作します。

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop

私は、Debian 8 Sid で GNU bash バージョン 4.4.0(1)-release (x86_64-pc-linux-gnu) を使用し、grep (GNU grep) 2.26 を使用しています。xfce と mate ターミナルの両方で試しましたが、動作は同じです。

ありがとう

答え1

このような問題が発生した場合は、正常に動作するものが得られるまでテストから項目を削除する必要があります。

たとえば、出発点が次の場合:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment

まず変数の部分を削除します:

cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'

次に2番目を剥ぎ取りますgrep:

cat /usr/share/applications/brasero.desktop |grep '^Comment='

次に、別の grep を実行します。

cat /usr/share/applications/brasero.desktop

最終的には、それが機能し始めるポイントが見つかるでしょう。あなたの特定のケースでは、次のように機能し始めます。

cat /usr/share/applications/brasero.desktop |grep '^Comment='

grepつまり、問題なのはその 2 番目です。他のものを戻して、まだ動作するかどうかを確認します。

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment

確かにそうです。では、何が問題なのでしょうか? この最後の出力がカラーであることに注目してください。出力には ANSI カラー エスケープ コードが含まれています。これが 2 番目grepの一致を妨げています。

修正するには、grepエイリアスを に変更するか--color=auto、 を実行するunalias grepか、--color=neverコマンドに手動で を追加します。


これについては別のアプローチも考えられます。スクリプト内で動作することがわかっているので、唯一の説明は環境によるものであるということです。

したがって、クリーンな環境から始めてbash --noprofile --norc、プロファイルが壊れるまで少しずつプロファイルを導入していくことができます。

ただし、この手法には注意点があります。 を使用しても--noprofile --norc、履歴の拡張やジョブ制御など、CLI とスクリプトの間にはいくつかの違いがあります。ただし、これらをオフにすることもできます:set +Hおよびset -m

関連情報