どの亜種を簡単に見つけるか私のディストリビューションで使用するには?

どの亜種を簡単に見つけるか私のディストリビューションで使用するには?

ターミナル、シェルなどで基本的なC機能と他のコマンド(sed、awkなど)の使い方を学ぶと、オペレーティングシステムによって動作が少しずつ異なることに気づきました。 GNU 拡張と開発者のセキュリティ強化により、ディストリビューション間にはもちろん、MacOS、Linux、BSD の間にも微妙な違いがあります。何十ものウェブページを検索しなくても、私のシステムがどのバージョンを使用しているのか、どうすればわかりますか?

man役に立ちません。たとえば、man printfステータスNOTE: your shell may have its own version of printf, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.

答え1

ほとんどのコマンドには、探している情報を出力するために使用できるオプションがあります。あなたが言及したsedアッ、--versionパラメータを試してください:

Tux ~ $ awk --version
awk --version
GNU Awk 5.1.1, API: 3.1

専用オプションが常に提供されるわけではありません。バージョンyourcommand -h一般的に教えてください。そうでない場合は、マンページを参照してください。

その点で、特定のシェル組み込み機能がしばしば情報を生成しないという問題があると正しく書かれていますprintf

Tux ~ $ printf --version
bash: printf: --: invalid option
printf: usage: printf [-v var] format [arguments]

マンページに書いてありますが印刷機能--version パラメータに従います。
これにより、組み込み機能を使用していることを推論できます。印刷機能付属の機能ではなく機能コアツールパッケージ、バージョンは以下を使用してフルパスをトリガーできます。

Tux ~ $ which printf
/usr/bin/printf
Tux ~ $ /usr/bin/printf --version
/usr/bin/printf --version
printf (GNU coreutils) 8.32
Packaged by Gentoo (8.32-r1 (p0))

答え2

ほとんどのBourne型シェルには

type cmd

(と同じcommand -V cmd)は、シェルがこれを次のように解釈すると通知しますcmd

bash-5.2$ type time
time is a shell keyword

timeこの場合、構文はシェル構文の単語であり、info bash timeこれについて詳しく学ぶために実行されます。

zsh$ type ls
ls is a shell function from /home/stephane/.zshrc

ls私のシェルの起動ファイルの関数としてオーバーライドされました。functions ls/typeset -f lsまたはwhich ls(略語)を使用すると、そのwhence -c ls定義を表示できますzsh

ksh$ type r
r is an alias for 'hist -s'

ksh93、zsh、またはbashはさらに一歩進んで、キーワード、エイリアス、関数、組み込みおよび実行可能ファイル(および/または実行可能ファイルのハッシュテーブル)で見つけることができるすべてのバリエーションを提供しますtype -a cmdcmd$PATH

bash-5.2$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
zsh$ mac:~$ type -a echo
echo is a shell builtin
echo is /home/stephane/bin/echo
echo is /bin/echo

tcshシェルでwhich cmdこれを使用してより詳細な情報を提供できます(このオプションをサポートするtypezshでも機能します)。which-a

ファイルシステムで実行可能ファイルとして見つかるさまざまなコマンドの場合、次のような状況で複数のバリエーションが見つかる可能性があります。

  • バリエーションは、一部のサードパーティ製ソフトウェアの一部としてインストールされます。 Homebrew経由のmacOSと同じです。
  • システムは複数の標準をサポートしており、設定によって環境で互換性のある標準を選択できます。$PATHSolarisでXPG4またはXPG6モジュールをインストールしてPOSIX準拠(他のバージョン)を有効にできるように、標準の実行可能ファイルのバージョンは/usr/xpg6/bin次のとおりです。/usr/xpg4/bin事前に/bin可能です。ドキュメントの入手方法を教えてくれます。$PATHman standards
  • 書き込み権限を持つディレクトリにいくつかのバリエーションを直接インストールします~/bin$PATH
  • システム管理者は、次のバリエーションをローカルにインストールしました/usr/local/bin

そのような場合は、関連ディレクトリで文書を検索する$MANPATHように更新されている可能性があります。トピックに関するすべてのマニュアルページを読み込むことができます。manman -a

Debian とその派生物では、使用可能なコマンドの代替実装を使用できます。たとえば、locateGNU findutils、mlocate、または plocate からコマンドをインポートできます。複数のパッケージがインストールされている場合、システム管理者はコマンドを実行してデフォルトで使用されるupdate-alternativesパッケージを選択できます。他の代替パッケージはまだlocate.findutils別の名前(たとえば)で呼び出すことができ、マニュアルページには常に別の名前でアクセスできます。

詳細については、実行してくださいupdate-alternatives --display。例えば

$ update-alternatives --display locate
locate - auto mode
  link best version is /usr/bin/plocate
  link currently points to /usr/bin/plocate
  link locate is /usr/bin/locate
  slave locate.1.gz is /usr/share/man/man1/locate.1.gz
  slave updatedb is /usr/bin/updatedb
  slave updatedb.1.gz is /usr/share/man/man1/updatedb.1.gz
  slave updatedb.8.gz is /usr/share/man/man8/updatedb.8.gz
/usr/bin/locate.findutils - priority 20
  slave locate.1.gz: /usr/share/man/man1/locate.findutils.1.gz
  slave updatedb: /usr/bin/updatedb.findutils
  slave updatedb.1.gz: /usr/share/man/man1/updatedb.findutils.1.gz
/usr/bin/plocate - priority 90
  slave locate.1.gz: /usr/share/man/man1/plocate.1.gz
  slave updatedb: /usr/sbin/updatedb.plocate
  slave updatedb.8.gz: /usr/share/man/man8/updatedb.plocate.8.gz

関連情報