ターミナル、シェルなどで基本的な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 cmd
。cmd
$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
これを使用してより詳細な情報を提供できます(このオプションをサポートするtype
zshでも機能します)。which
-a
ファイルシステムで実行可能ファイルとして見つかるさまざまなコマンドの場合、次のような状況で複数のバリエーションが見つかる可能性があります。
- バリエーションは、一部のサードパーティ製ソフトウェアの一部としてインストールされます。 Homebrew経由のmacOSと同じです。
- システムは複数の標準をサポートしており、設定によって環境で互換性のある標準を選択できます。
$PATH
SolarisでXPG4またはXPG6モジュールをインストールしてPOSIX準拠(他のバージョン)を有効にできるように、標準の実行可能ファイルのバージョンは/usr/xpg6/bin
次のとおりです。/usr/xpg4/bin
事前に/bin
可能です。ドキュメントの入手方法を教えてくれます。$PATH
man standards
- 書き込み権限を持つディレクトリにいくつかのバリエーションを直接インストールします
~/bin
。$PATH
- システム管理者は、次のバリエーションをローカルにインストールしました
/usr/local/bin
。
そのような場合は、関連ディレクトリで文書を検索する$MANPATH
ように更新されている可能性があります。トピックに関するすべてのマニュアルページを読み込むことができます。man
man -a
Debian とその派生物では、使用可能なコマンドの代替実装を使用できます。たとえば、locate
GNU 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