「適切なコンテンツなし」を省略し、説明とともにアプリのリストを表示します。

「適切なコンテンツなし」を省略し、説明とともにアプリのリストを表示します。

私はいくつかの機能を備えたスクリプトを作業してきました。

「適切なコンテンツなし」行を表示せずに、「/usr/share/applications」フォルダ内のすべてのアプリケーションのWhatisコマンドの出力を表示する機能を追加しようとしています。

私の現在のコマンドの試みは次のとおりです

whatis $(ls /usr/share/applications | cut -d "." -f 1) | grep -i -v "nothing appropriate"

私が経験している問題は、grepコマンドが機能していないようで、「適合しない」というフレーズを含む行が引き続き表示されることです。

また、「replace」コマンドと「sed」コマンドを使用して不要な行を空白に変換するなど、さまざまな回避策を試しましたが、これも問題を解決できませんでした。

上記のすべての試みでは、コマンドを直接出力し、出力をファイルにルーティングし、ファイルの「cat」出力に対してフィルタを実行してみました。

誰でも他のオプションをお勧めできますか?

ベストアンサー1

エラーメッセージは通常に記録され、にstderrパイプするだけです。 Bourneなどのシェルからstdoutとstderrをパイプするには、次のようにします。stdoutgrepfish

whatis... 2>&1 | grep -v 'nothing appropriate'

これは、stdoutとstderrが最終的にstdoutにマージされることを意味します。

そこにあるシェルはパイプを見てそれをwhatis... 2>&1合計に分割grep -v 'nothing appropriate'し、パイプの書き込みの終わりである左パイプのstdout(ファイル記述子1)と他のパイプの右パイプのstdin(fd 0)を使用してそれを検出します。パイプはそれぞれ別々のプロセスで同時に実行されます。

両側でリダイレクトが処理されます。2>&1注:fd 2をfd 1で開いたのと同じコンテンツ(ここではパイプ)にリダイレクトします。したがって、fd 1と2は両方ともパイプに入ります。

rc-likeシェルに対応する構文は、whatis... >[2=1] | grep...-likecshシェルと同じですwhatis... |& grep...(zshにも適用されます)。

ksh93zshまたはを使用すると、フィルタリングされたパイプラインにのみ送信bashできます。stderr

whatis... 2> >(grep -v 'nothing appropriate' >&2)

ただし、grepコマンドは待たないため、コマンドが返された後に追加のエラーメッセージが表示されることがあります。これは次の方法で回避できますzsh

{whatis...} 2> >(grep -v 'nothing appropriate' >&2)

(またはもっと辛いksh93ことbash)。

あなたはyash使用することができますプロセスリダイレクト(構文は次のようになります。プロセスの交換しかし、違いは、拡張ではなくリダイレ​​クト演算子であるということです。同じ問題は、フィルタコマンドを待たないことです。

whatis... 2>(grep -v 'nothing appropriate' >&2)

代わりににcut -d "." -f 1変更します。分割+グローブを呼び出すため、またはグローブ文字を含むアプリケーション名にも問題があります。org.gnome.Settings.desktoporgorg.gnome.Settings$IFS

これにより、zsh次のことができます。

whatis -- /usr/share/applications/*.desktop(:t:r) |& grep -v 'nothing appropriate'

ここで、ファイルのail(dirname)とルート名(拡張子なし)を:t取ります。t:r|&2>&1 |

では、bash次のことができます。

(
  shopt -s failglob
  set /usr/share/applications/*.desktop
  set -- "${@##*/}"
  whatis -- "${@%.*}" 2>&1
) | grep -v 'nothing appropriate'

はと"${@##*/}"同じで:t"${@%.*}"はと同じです:r

GNU ls9.0以降では、次のこともできます。

ls --zero /usr/share/applications/ |
  LC_ALL=C sed -zn 's/\.desktop$//p' |
  xargs -r0 whatis -- 2>&1 |
  grep -v 'nothing appropriate'

ls --zero後処理可能な形式でリストを出力し、拡張子をsed削除し、代替項目がある場合(拡張子のないファイルを除く.desktop)結果を出力し、リストをに渡してエラーをフィルタリングします。.desktopxargswhatisgrepnothing appropriate

GNUを使用すると、basename次のこともできます。

(
  shopt -s failglob
  basename -zs .desktop /usr/share/applications/*.desktop
) |
  xargs -r0 whatis -- 2>&1 |
  grep -v 'nothing appropriate'

また、デスクトップファイルの名前が実行可能ファイルの名前(存在する場合)と一致しないことが多いため、そのマニュアルページがない可能性があります。

whatis.desktopルート名をに渡すのではなく、これらのファイルからいくつかのフィールドを抽出することもできます。たとえば、

(cd /usr/share/applications && 
  grep -HPom1 -e '^GenericName=\K.*' -- *.desktop
)

GenericNameこれらのファイルからフィールドが最初に表示される値が抽出されます。

おすすめ記事