私はいくつかの機能を備えたスクリプトを作業してきました。
「適切なコンテンツなし」行を表示せずに、「/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をパイプするには、次のようにします。stdout
grep
fish
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にも適用されます)。
ksh93
、zsh
またはを使用すると、フィルタリングされたパイプラインにのみ送信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.desktop
org
org.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 ls
9.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
)結果を出力し、リストをに渡してエラーをフィルタリングします。.desktop
xargs
whatis
grep
nothing 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
これらのファイルからフィールドが最初に表示される値が抽出されます。