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、バージョン4.4.0(1)-リリース(x86_64-pc-linux-gnu)でGNU bashを使用しており、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問題があります。他のものをもう一度追加し、まだ機能していることを確認してください。

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

もちろん。それでは、問題は何ですか?さて、最後の出力の色がどうなるか見ましたか?出力にはANSIカラーエスケープコードが含まれています。これは第2のgrep一致を防止する。

回避策は、grep別名を--color=autoまたはdoに変更するか、手動でコマンドにunalias grep追加することです。--color=never


この問題を解決する別の方法があります。スクリプト内で動作することを知っているので、唯一の説明はアンビエントということです。

したがって、クリーンな環境で起動し、bash --noprofile --norcプロファイルが損傷するまで少しずつプロファイルのインポートを開始します。

しかし、この技術には問題があります。それにもかかわらず、--noprofile --norcCLIとスクリプトには、履歴拡張、タスク制御などのいくつかの違いがあります。ドラッグすることもできます:set +Hset -m

関連情報