私の端末に奇妙な動作があります。
次のコマンドは端末に何も印刷しません。
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 --norc
CLIとスクリプトには、履歴拡張、タスク制御などのいくつかの違いがあります。ドラッグすることもできます:set +H
とset -m
。