ls
私のLinuxコンピュータでは、次から始まるコマンドを見つけることができます。
$ ls<TAB-key>
私はこの結果を得る
ls lsb_release lscpu lshw lsipc lslogins lsmod lsof lspcmcia lss16toppm
lsattr lsblk lsdiff lsinitramfs lslocks lsmem lsns lspci lspgpot lsusb
今、lsmod
他のコマンドが何であるかを知りたいです。
私が知っている限り、次のような$ man lsmod
他のコマンドがあります。
SEE ALSO
insmod(8), modprobe(8), modinfo(8) depmod(8)
mod string
しかし、端末で使用するコマンドが見つかりませんワイルドカード。どんな状況でも達成する方法を案内してください。UnixとLinuxディストロ
答え1
一部のシェルにはこれをサポートする機能が組み込まれています。
扱いにくい
zsh
シェルの自己検査組み込みコマンドの多くは、-m
パターンm
マッチングのための引数を使用します。これはwhence
、他のシェルユーザー(cshユーザーと同じ、(標準)SysVシェルユーザー)の便宜のために提供されるコマンドとバリアントを識別し、内部ハッシュを操作するための場合(kshからのコピーと拡張)です。which
標準の組み込みコマンドテーブル、コマンドパステーブルを含みます。whence -c
type
whence -v
hash
whence -m '*mod*'
type -m '*mod*'
which -m '*mod*'
hash -m '*mod*'
最初の3つは、組み込み関数、関数、キーワード、およびエイリアスも表示します。 forなどの-p
コマンドに制限を追加します。$PATH
hash
あるいは、以下を使用して、一致する実行可能ファイル$PATH
($path
配列にマップされている)を手動で見つけることもできます。
print -rC1 -- $^path/*mod*(DN-*)
一部の組み込みコマンドに加えて、zshは内部検査(および完了を支援するため)のためにいくつかの特殊変数にいくつかの内部状態とキャッシュデータを公開します。たとえば、コマンドのハッシュテーブルとそのパスは特殊な$commands
連想配列に公開されるため、次のようにキーを表示できます。
print -rC1 -- ${(kM)commands:#*mod*}
パターンマッチングは${(M)array:#pattern}
演算子を使用して行われます。
ここでは、一般的な完成に加えて、ワイルドカードの一致を試みるように完成システムを設定することもできます。たとえば、少なくとも:
zstyle ':completion:*' completer _complete _match
autoload -Uz compinit
compinit
に~/.zshrc
次のように入力します。
$ *mod*<Tab>
パターンに一致する可能なコマンドのリストが表示されます。しかし:
$ man -s1,8 *mod*<Tab>
Completing manual page
check-module mk_modmap
chmod modinfo
combine_lang_model modprobe
depmod perlmod
dh_gtkmodules perlmodinstall
[...]
パート1(ユーザーコマンド)とパート8(システム管理コマンド)に含まれるマニュアルが表示されますmod
。
zsh
初めて実行すると、newuser
これらすべてを調整できるメニューが表示されます。上記の内容は以下から確認できます。
(1) Continue to the main menu.
[...]
(2) Configure the new completion system. (Recommended.)
[...]
(2) Run the configuration tool (compinstall)
[...]
1. Completers: choose completion behaviour for tasks such as
approximation, spell-checking, expansion.
[...]
m. Set completers that modify the behaviour of the four main ones above.
[...]
1. _ignored: Use patterns that were previously ignored if no matches so far.
2. _list: Only list matches until the second time you hit TAB.
3. _oldlist: Keep matches generated by special completion functions.
4. (*) _match: If completion fails, retry with pattern matching.
5. _prefix: If completion fails, retry ignoring the part after the cursor.
上から4を選択してください。しかし、もっとおいしい食べ物があるので、メニュー全体を見ることをお勧めします。
強く打つ
bash
シェルでは、次のものを使用できます。
compgen -cX '!*mod*'
それは次のとおりです。
compgen -A command -X '!*mod*'
compgen -c
/は、パターンに一致するコマンドを除外する意図としてcompgen -A command
知られているコマンド(キーワード、エイリアス、組み込み、および機能を含む)のリストを提供しますが、で始まるパターンは除外から包含に変更されます。-X
!
rcとデリバティブ
リストrc
は、cshやzshなどの$path
環境変数に関連付けられています。$PATH
ls -d -- $path/*mod* >[2] /dev/null
sまたはglob修飾子rc
と同等のものがないため、リストは実行可能ファイルに限定されず、隠されたファイルも含まれません。zsh
D
-*
rc
Bourneシェルやほとんどの派生製品と共有されるバグ機能は、一致しないglobパターンがそのまま残ることです。したがって、指定されたディレクトリに一致するものがない場合は、文句を言うリストを渡して/that/dir/*mod*
この問題を解決します。名前には存在しないファイルが含まれていますが、ls
Bourneなどのシェルを使用してこれらのエラーを削除します。*
>[2] /dev/null
2> /dev/null
fish
魚
に似ており、rc
実行不可能に関する同じ警告がありますが、{.,}
パターンプレフィックスを追加して隠しファイルサポートを追加します。
printf '%s\n' $PATH/{,.}*mod*
POSIX sh
POSIX shでは、次の関数を定義できます。
find_commands() (
pattern=$1
IFS=:; set -o noglob
set -- $PATH''
IFS=; set +o noglob
for dir do
for file in "${dir:+$dir/}"$pattern "${dir:+$dir/}".$pattern; do
if [ -f "$file" ] && [ -x "$file" ]; then
printf '%s\n' "$file"
fi
done
done
)
次のように使用されます。
find_command '*mod*'
1$PATH
空のコンポーネントがあると正しく動作しません。PATH=/bin/:/usr/bin:
最後の空のコンポーネントは、現在の作業ディレクトリを見つけることを意味するためです。この問題は空です。${^path/#%/.}
文字列は、他のシェルが/ディレクトリを手動で見つけるために、以下のソリューションにも同様に適用されます。.
$PATH
$PATH
$PATH
$path
答え2
# in at least bash
start cmd:> ( IFS=: ; find $PATH -type f -name 'ls*' -perm /111 -ls )
96723 4 lrwxrwxrwx 1 root root 4 Mär 19 23:08 /usr/bin/lsmod -> kmod
281915 4 lrwxrwxrwx 1 root root 11 Mär 19 22:35 /usr/bin/lsb-release -> lsb_release
733984 4 -rwxr-xr-x 1 root root 2479 Mär 20 05:53 /usr/bin/lss16toppm
734097 4 -rwxr-xr-x 1 root root 1821 Mär 19 22:36 /usr/bin/lsdev
955869 12 -rwxr-xr-x 1 root root 10514 Mär 19 22:35 /usr/bin/lsb_release
1070923 16 -rwxr-xr-x 1 root root 14215 Mär 20 00:13 /usr/bin/lsusb.py
1245610 136 -rwxr-xr-x 1 root root 138016 Apr 1 19:45 /usr/bin/ls
1254310 104 -rwxr-xr-x 1 root root 104632 Apr 1 21:16 /usr/bin/lscpu
1254311 76 -rwxr-xr-x 1 root root 73928 Apr 1 21:16 /usr/bin/lsfd
1254312 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:16 /usr/bin/lsipc
1254313 28 -rwxr-xr-x 1 root root 26808 Apr 1 21:16 /usr/bin/lsirq
1254314 32 -rwxr-xr-x 1 root root 31304 Apr 1 21:16 /usr/bin/lslocks
1254315 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsmem
1254316 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsns
1254878 136 -rwxr-xr-x 1 root root 137400 Apr 1 21:22 /usr/bin/lsblk
1254879 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:22 /usr/bin/lslogins
1255279 84 -rwxr-xr-x 1 root root 85136 Mär 19 22:34 /usr/bin/lsscsi
1255280 176 -rwxr-xr-x 1 root root 179912 Mär 19 22:50 /usr/bin/lsof
1258862 2980 -rwxr-xr-x 1 root root 3048800 Mär 20 06:13 /usr/bin/lsar
1264433 16 -rwxr-xr-x 1 root root 14456 Mär 19 22:35 /usr/bin/lsattr
1264457 12 -rwxr-xr-x 1 root root 11989 Mär 20 04:18 /usr/bin/lsinitrd
1271261 104 -rwxr-xr-x 1 root root 106376 Mär 19 23:14 /usr/bin/lspci
1272752 252 -rwxr-xr-x 1 root root 256328 Mär 20 00:13 /usr/bin/lsusb
答え3
マニュアルページを検索するには(多くの実装と同様にapropos
)、すべてのマニュアルページとその要約のインデックスに対していくつかの正規表現マッチングを実行する方法を使用できます。man -k
man
apropos
以下で使用mandb
(Linuxベースのシステムで一般的)、
apropos mod
名前または要約が正規表現に一致するマニュアルページエントリを返しますmod
(これはシェルグロブワイルドカードパターンとは異なります)。つまり、mod
。
表示するセクションまたはセクションのリストを指定することもできます。
緑ではなく名前だけを検索するには、ページmod
名にスペースはほとんど含まれていませんが、緑にはほとんど常にスペースが含まれているという事実を利用できます。
だから:
apropos -s1,8 '^[^ ]*mod[^ ]*$'
セクション1と8のマニュアルページを返す必要があります。名前mod
含まれています。正規表現は、タイトル()の始まり、^
スペース()を除くすべての数字()文字、スペース()を除くすべての数字()文字、タイトルの終わり()と一致するために含まれます。一言で言えば、周りにスペースはありません。*
[^ ]
mod
*
[^ ]
$
mod