web-dev-qa-db-ja.com

代替バイナリを使用する適切な方法は何ですか

Linux Mint 18 Cinnamon64ビットを使用しています。

7zの次のバイナリとそのバージョンがシステムにあります。

/usr/bin/7z

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

そして

/usr/local/share/PeaZip/res/7z/7z

7-Zip [32] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21

私は常に後者を使用しているので、それにフルパスを書くことはますます面倒になっています。

aliasを定義するだけでいいですか、それとももっとクリーンな方法がありますか?

1

パッケージの更新後も存続するようにDebianでバイナリを別のバイナリに置き換える方法(たとえば、BINDパッケージのinitファイルの置き換え)は、ファイルの迂回を行うことです。

基本的に、ファイルの流用は元のファイルを別の場所にインストール/移動し、パッケージ管理システムに、元の場所に変更を加えずに、そのファイルに対する後続のインストール更新を新しい場所に配置するように指示します。

Debian ポリシーマニュアル--diversions によると、あなたの場合:

dpkg-divert --divert /usr/local/share/PeaZip/res/7z/7z.old --rename /usr/bin/7z
cp /usr/local/share/PeaZip/res/7z/7z /usr/bin/7z

迂回を削除するには:

dpkg-divert --remove /usr/bin/7z

迂回を試みる前に、両方のバイナリのバックアップコピーを作成してください。

その他のコマンドについては、以下を参照してください。 バイナリとファイルをdpkg-divertに置き換えます

もう1つの簡単な方法は、元のパッケージを保持することです。パッケージマネージャーに更新を適用しないように指示し、次のように新しいバイナリをコピーします。

echo "p7Zip hold" | dpkg --set-selections

またはより単純:

apt-mark hold p7Zip

参照: Debianでパッケージが更新されないようにする方法

もう1つのよりクリーンなオプションは、新しいp7Zipバージョンでdebを構築することですが、方法と特定の手順はパッケージによって異なるため、ここでは説明しません。

1
Rui F Ribeiro

上記のRuiF Ribeiroの回答に加えて、update-alternativesをテーブルに持ち込みたいと思います。同じプログラムで使用可能な異なるバイナリ間の切り替えを管理することは非常に便利です。

まず、インストールされているバイナリが/usr/binの実際のバイナリなのか、それとも単なるシンボリックリンクなのかを確認します。これは、ls -laを使用して実行できます。例:

$ ls -la $(which 7z)

# If it is a binary, it will look like this:
-rwxr-xr-x 1 root root 39 Aug 15  2016 /usr/bin/7z

# If a symlink, something like this:
lrwxrwxrwx 1 root root 20 Apr  9 12:58 /usr/bin/7z -> /some/another/path/7z

バイナリを見つけた場合は、dpkg-divertコマンドを使用して、現在の場所からバイナリを移動します。

$ Sudo dpkg-divert --divert /usr/bin/7z.dist --rename /usr/bin/7z

これで、AlternativesManagerを使用できます。コマンドの形式は次のとおりです。

$ Sudo update-alternatives --install <link> <name> <path> <priority>

両方のバイナリを7z代替グループに追加します。

$ Sudo update-alternatives --install /usr/bin/7z 7z /usr/bin/7z.dist 10
$ Sudo update-alternatives --install /usr/bin/7z 7z /usr/local/share/PeaZip/res/7z/7z 20

/usr/bin/7zにシンボリックリンクが作成され、リストの優先度が最も高いバイナリを指します。何らかの理由でバイナリを切り替える必要がある場合は、次のようにしてください。

$ Sudo update-alternatives --config 7z

インタラクティブなプロンプトで、使用するバイナリを尋ねられます。

There are 2 choices for the alternative 7z (providing /usr/bin/7z).

  Selection    Path                                   Priority   Status
-------------------------------------------------------------------------
* 0            /usr/local/share/PeaZip/res/7z/7z       20        auto mode
  1            /usr/bin/7z.dist                        10        manual mode
  2            /usr/local/share/PeaZip/res/7z/7z       20        manual mode

Press <enter> to keep the current choice[*], or type selection number: 

必要なSelection番号を入力し、Enterキーを押します。完了!このアプローチの良いところは、開いているすべてのシェルセッションを含め、システム全体に即座に適用されることです。 PATHを操作する必要はなく、必要なときにいつでも元のバイナリに簡単に戻すことができます。

2

PATH環境変数を調整して、7zの特定のディレクトリを含めることができます。

export PATH=/usr/local/share/PeaZip/res/7z:$PATH

7z/usr/local/binにインストールしたり、このディレクトリにリンクしたりすることはできますか?

多くの場合、/usr/local/lib/usr/binの前にあるため、適切なバイナリが見つかります。

1
xtrmz