
特定の Debian パッケージがどのコマンドを提供するかを知りたいです。
たとえば、というパッケージをインストールしたとしますx.deb
。このパッケージには、私が使用できるいくつかのコマンドが確実に含まれています。
これらのコマンドをリストする方法。
compgen
bashコマンドを使用してシステムで利用可能なすべてのコマンドのリストを生成できることを知っていますが、必要なのは特定のパッケージだけです。
私は解決を試みた:
dpkg -L postgresql-9.3 | egrep '(bin|games)/'
/usr/lib/postgresql/9.3/bin/pg_upgrade
/usr/lib/postgresql/9.3/bin/pg_ctl
/usr/lib/postgresql/9.3/bin/pg_resetxlog
/usr/lib/postgresql/9.3/bin/postgres
/usr/lib/postgresql/9.3/bin/pg_xlogdump
/usr/lib/postgresql/9.3/bin/initdb
/usr/lib/postgresql/9.3/bin/pg_controldata
/usr/lib/postgresql/9.3/bin/postmaster
私はコマンドを試しましたpostgres
user@userPc:~$ postgres
No command 'postgres' found, did you mean:
Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found
答え1
これを使用dpkg -L pkgname
し、grepコマンドでパイプしてbin/
andを検索しますgames/
。
$ dpkg -L bash | grep -E '/(s?bin|games)/'
/bin/bash
/usr/bin/bashbug
/usr/bin/clear_console
/bin/rbash
すべてのバイナリが含まれているかどうかを確認するには、$PATH
次のbash機能を試してください。
find_binaries (){
dpkg -L "$@" | while read -r; do
[ -f "$REPLY" -a -x "$REPLY" ] && echo "$REPLY"
done
}
次のように呼び出します。
$ find_binaries postfix
...SNIP...
/usr/lib/postfix/postfix-files
/usr/lib/postfix/pipe
/usr/lib/postfix/proxymap
/usr/lib/postfix/local
/usr/lib/postfix/discard
...SNIP...
答え2
1. 作業に合わせて設計されたツールを使用します。
最も簡単で最も安定した方法は、以下をインストールすることですdlocate
。
sudo apt-get install dlocate
だからあなたは実行することができます
dlocate -lsbin package-name
説明したようにman dlocate
:
-lsbin List full path/filenames of executable files (if any) in package
2. パッケージデータベースの解析
これは@Winnyのアプローチと似ていますが、単純化されました。
apt-file -F list package | cut -d ' ' -f 2 |
while read file; do [[ -x $file && -f $file ]] && echo "$file"; done
まだインストールされていない場合は、apt-file
次のコマンドを使用してインストールして設定できます。
sudo apt-get install apt-file
sudo apt-file update
上記のコマンドはapt-file
パッケージの内容をリストし、bashテスト-f
(ファイルですか?)と-x
(実行可能ですか?)をリストし、両方のテストが合格するとファイル名を印刷します。
次のコマンドのようなコマンドを使用すると、最大実行可能ファイル:
apt-file -L list package | grep -Ew 'bin|sbin'
/opt
同様の場所や場所でも実行可能ファイル(/lib
さまざまなツールなど)を取得できるため、すべてを見つけることはできません。udev
したがって、-w
単語全体を一致させるにはファイルを正しく識別する可能性が高くなりますが、パスを解析するのは良いアプローチではないため、上記のいずれかの方法を使用する必要があります。
答え3
dlocate
すでにインストールされている場合は、簡単な方法がありますインストールされたパッケージのすべてのコマンドをリストします。
dlocate -lsbin PACKAGE-NAME
justを使用すると、dpkg
標準のPATHディレクトリ(まれな例外を除いてほぼすべての実行可能プログラム)のファイルを一覧表示できます。
dpkg -L PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u
例外はいくつかのディレクトリです。 Debian wheezy で始まる/usr/bin/mh
と/usr/bin/nu-mh
。
パッケージがインストールされていない場合は、次のものdpkg -L
と交換してくださいapt-file -F list
。
apt-file -F list PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u
別のディレクトリに実行可能ファイルがありますが、直接実行するためのものではないため、ここでは関係ありません。
これらの方法はすべて1セットのプログラムを見逃しています。代替器具。例えば、ftp
パッケージにはのみ提供されますが、netkit-ftp
パッケージは実際にシステムの実装の1つへのシンボリックリンクとしてコマンドを提供します。次のコマンド(良いプログラミングの例ではなく、単に大きな1つの縮小)は、現在構成されている代替メカニズムを介してパッケージによって提供されるコマンドをリストします。pftp
ftp
/usr/bin/ftp
/etc/alternatives/ftp
ftp
/usr/bin/netkit-ftp
perl -lwe 'foreach (`dpkg -L @ARGV`) {chomp; ++$p{$_}} foreach (</bin/* /sbin/* /usr/bin/* /usr/sbin/*>) {$e = readlink; next unless defined $e and $e =~ m!^/etc/alternatives/!; $t = readlink $e; print if $p{$t}}' PACKAGE_NAME…
他のパッケージを指す代替エントリに対して現在の設定に付属する可能性のあるコマンドを一覧表示するには、解析が必要です/var/lib/dpkg/alternatives
。
代替メカニズムを実装するシンボリックリンクと構成ファイルはパッケージに登録されませんが、自動的に登録されるため、削除されたpostinst
パッケージによって提供される代替項目を照会することは困難です(パッケージのインストールスクリプトが規則に従わない場合、実際には技術的に不可能です。 .)
答え4
次のコマンドを使用して、systemdをターゲットパッケージの名前に置き換えます。このコマンドは、利用可能なすべてのコマンドと簡単な紹介をリストします。
dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null