使用可能なすべてのコマンドとエイリアスを一覧表示するLinuxコマンド


280

このターミナルセッションで使用可能なすべてのコマンドとエイリアスを一覧表示するLinuxコマンドはありますか?

「a」を入力してタブを押した場合と同じですが、アルファベットのすべての文字が対象です。または、「エイリアス」を実行するだけでなく、コマンドを返します。

どうして?以下を実行して、コマンドが使用可能かどうかを確認したいと思います。

ListAllCommands | grep searchstr

TABボタンを2回押して、環境で使用可能なすべてのコマンドをリストします
ntshetty

回答:


599

組み込みのbash(1)を使用できます compgen

  • compgen -c 実行できるすべてのコマンドが一覧表示されます。
  • compgen -a 実行できるすべてのエイリアスが一覧表示されます。
  • compgen -b 実行できるすべての組み込みをリストします。
  • compgen -k 実行できるすべてのキーワードがリストされます。
  • compgen -A function 実行できるすべての関数がリストされます。
  • compgen -A function -abck 上記のすべてを一度にリストします。

生成できる他の補完については、manページを確認してください。

質問に直接回答するには:

compgen -ac | grep searchstr

あなたがしたくないことをする必要があります。


1
csh / tcshにこれに相当するものはありますか?これらの端末には、タブで使用されるある種のオートコンプリート機能もあります。
krb686 2015

2
の代わりにcompgen | grep、文字列を引数としてcompgenそれ自体に渡す方が効率的です(質問で暗黙的に示されているように、プレフィックスであることがわかっている場合)。この場合、それはですcompgen -ac searchstr
Toby Speight 2017

実際、ubuntuはに「適切なものwhatis compgenなし」と「手動入力なし」を表示しman compgenます。
MarAvFe 2017

1
@MarAvFe:それはbash組み込みであり、独自のmanページを持つ個別のコマンドではないためです。bash(1)マニュアルページを読むかhelp compgenbashコマンドラインで実行する必要があります。
camh 2017

拡張により、実行compgen -c | sort | uniq | lessすると、重複する行なしで使用可能なすべてのコマンドが印刷され、アルファベット順にソートされます。
ファビアン

39

.bashrcに追加

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

エイリアスも必要な場合は、次のようにします。

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

これは非常に近いですが、エイリアスは含まれていません。エイリアスを追加する方法| 結果に-f1をカットしますが、ソートの前ですか?
ACK

1
とにかく出力をgrep経由で出力することだけが目的の場合、なぜ並べ替えをする必要があるのでしょうか。Unixの哲学は、単純なツールを作成し、必要に応じてそれらをチェーン化することです。そのため、ListAllCommandsをソートせず、ユーザーが出力をソートしたい場合は、ソートできるようにします。
danio 2010

4
並べ替えは、重複を削除することです。
Ants Aasma

1
これは、実行可能ファイルへのシンボリックリンクであるコマンドを検出しません。オプション-Lonを使用して、シンボリックリンク先に移動します。注:-Lはオプションであり、一致する式の一部ではないため、コマンドラインのパスの前に配置する必要があります。この場合、find -L {}
Adaephon

1
STDERRを/ dev / nullにリダイレクトして、存在しないディレクトリ警告を抑制したい場合があります。echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(zsh互換性のために+1)
TheLonelyGhost '19年

27

そこには

type -a mycommand

mycommandが使用される$ PATH内のすべてのエイリアスとコマンドをリストするコマンド。コマンドがいくつかのバリアントに存在するかどうかを確認するために使用できます。それ以外は... $ PATHとすべてのエイリアスを解析するスクリプトがおそらくあるでしょうが、そのようなスクリプトについては知りません。


1
それが質問への答えでなくても、私はそれが問題のより良い解決策であると私は思うgrepへの呼び出しよりも。したがって、-a fooと入力すると、fooが使用できない場合は、コマンドが見つからないか、またはそのようなものを返します。したがって、コマンド自体を呼び出さなくてもコマンドを確認できます。
Janusz

1
実際には、OPが「次を実行してコマンドが使用可能かどうかを確認したい」と尋ねたので、これは質問に対する回答です。そのため、目的はコマンドが使用可能かどうかを確認することであり、この回答は明確に機能します。
lothar 2009年

2
@lothar、探しているコマンドが「startserver」?、「serverstart」?、「server-something-or-other」?だったらどうなるでしょうか。わかっています。サーバーの "grep -i"を実行して、そこにあるかどうかを確認します。おっとっと。Bzzz、このソリューションではありません。matey :-)私はこの回答に投票するつもりはありませんが(限られた方法であっても役立つため)、完全な解決策では、grepが固定文字列だけでなく、正規表現用であることを考慮に入れます。
paxdiablo 2009年

6

「which searchstr」を使用します。バイナリのパスまたはエイリアスの場合はエイリアス設定を返します

編集:エイリアスのリストを探している場合は、以下を使用できます。

alias -p | cut -d= -f1 | cut -d' ' -f2

これを、PATH検索の回答に追加します。bashを使用していると仮定します。


6

その他のコマンドは、bashまたはより完全なバージョンのxargs(busyboxが制限されていた)を必要とするため、組み込みシステムでは機能しませんでした。

次のコマンドは、Unixライクなシステムで機能します。

フォルダごとにリスト:

ls $(echo $PATH | tr ':' ' ')

すべてのコマンドを名前でリストする

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

これはまだ依存していtrます。なぜ単純ではないのですls $(echo ${PATH//:/ })か?
mschilli

5

このスクリプトを試してください:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

これは、特定の既知のコマンドが存在するかどうかを確認するだけでなく、すべてのコマンドに対してこれを行う唯一のコードソリューションです。+1。
paxdiablo 2009年

3

Macユーザーの場合(findには-executable がなく、xargsには-dがありません):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

これをありがとう。@AntsAasmaの回答が機能しないMac以外のUNIXを実際に使用しています。これはMacとUnixでも機能します。現在使用しているUNIXバージョンを確認するために、どのコマンドを入力すればよいですか?ここで返信して、他のユーザーの問題を解決できますか?
prismaticorb 2013

Linux <corporate_proprietary_build_info_here> Mon Dec 12 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

コマンドに関連付けられたキーワードに基づいてコマンドをリストすると便利です。

使用する: man -k "your keyword"

自由に組み合わせてください:| grep "another word"

たとえば、テキストエディタを見つけるには: man -k editor | grep text


2

Altキーを押してみてください。(altと疑問符を同時に)。リストを作成するには、1、2秒かかります。bashで動作するはずです。


3
または、空白行の先頭でEscを4回押してみてください。
ephemient

それは驚くほど便利で、おかげでまだ知りませんでした:-)
Chris Huang-Leaver

2

これは、すべての実行可能ファイルエイリアスのリストを提供するソリューションです。またxargs -d、Mac OS Xなどが搭載されていないシステムにも移植可能で、スペースを含むパスを適切に処理します。

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

使用法:myscript.sh [grep-options] pattern、たとえばで始まるすべてのコマンドを検索するにはls、大文字と小文字を区別せず、次のようにします。

myscript -i ^ls

2

すべてのコマンドを一覧表示するショートカットメソッド。ターミナルを開き、「タブ」ボタンを2回押します。それはターミナルのすべてのコマンドを表示します


1
そして、あなたはそれをgrep正確にどのようにパイプしますか?
Toby Speight 2017

2

または、簡単な説明と組み合わせた便利なコマンドのリストを取得することもできます(コマンドにmanページがあり、ほとんどの場合)。

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

次に、好きなようにgrepします。

apropos -s 1 '' | grep xdg

収量:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

結果はソートされていないように見えるため、長いリストを探している場合は、|をスローできます。並べ替え| 真ん中に、それをless / more / mostのようなポケットベルにパイプします。ala:

apropos -s 1 '' | sort | grep zip | less

これは、名前またはその短い説明に「zip」が含まれるすべてのコマンドのソートされたリストを返し、その「少ない」ページャーに送ります。(「less」を$ PAGERに置き換えて、デフォルトのページャーを使用することもできます。)


1

いつでも次のことができます。

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

シェルは、パスenv varにリストされている場合にのみコマンドを実行します。


1

それはつまり、使用しているシェルに依存するということです。ここに私が見る制約があります:

  1. シェルと同じプロセスで実行する必要があります。見つけることができるコマンドに影響を与えるエイリアスや関数、変数をキャッチするには、PATHやEDITORを考えてください。EDITORはスコープ外と考えられます。物事に影響を与える可能性のあるエクスポートされていない変数を持つことができます。
  2. シェル固有であるか、カーネルに入って、/ proc / pid / enviornなどの友達には十分な情報がありません

私はZSHを使用しているので、ここにzshの答えがあります。次の3つのことを行います。

  1. ダンプパス
  2. エイリアス名をダンプします
  3. 環境にある関数をダンプします
  4. それらを並べ替えます

ここにあります:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

zshを使用する場合は、これで十分です。


0

問題は、タブ補完がパスを検索しているが、すべてのコマンドがパスに含まれていないことです。

bashを使用してパス内のコマンドを見つけるには、次のようにします。

x in echo $PATH | cut -d":" -f1; ls $ xを実行します。終わった


0

bashrcファイルに入れることができる関数は次のとおりです。

機能コマンド検索
{
   oldIFS = $ {IFS}
   IFS = ":"

   $ {PATH}のp
   行う
      ls $ p | grep $ 1
   終わった

   エクスポートIFS = $ {oldIFS}
}

使用例:

$コマンド検索gnome
gnome-audio-profiles-properties *
gnome-eject @
gnome-keyring *
gnome-keyring-daemon *
gnome-mount *
gnome-open *
gnome-sound-recorder *
gnome-text-editor @
gnome-umount @
gnome-volume-control *
polkit-gnome-authorization *
vim.gnome *
$

参考:IFSは、bashが文字列を分割するために使用する変数です。

確かに、これを行うにはいくつかのより良い方法があるかもしれません。


-1

多分私は誤解していますが、Display All Xの可能性が得られるまでEscapeを押したらどうなるでしょうか?


-2
compgen -c > list.txt && wc list.txt

1
これが何をするのか、またはこれがどのように機能するのかについての簡単な説明を追加することを検討してください。少なくとも、提案されたソリューションのフォローアップと理解のために、参照リンク(通常は関連するmanページ)を指定してください。
TheCodeArtist 2015

ファイルを使用することは常に良いオプションとは限りません。必要な場合は、少なくともtmpファイルにしてください(セキュリティに問題がない場合)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

次のように入力しないでください。

seachstr

ターミナルで。

シェルは次のような何かを言うでしょう

seacrhstr: command not found 

編集:

わかりました、私は反対投票をします、答えが愚かであるため、私は知りたいだけです:この答えのどこが悪いのか!!! 質問者は言った:

コマンドが使用可能かどうかを確認します。

コマンドを入力すると、それが利用可能かどうかがわかります!。

おそらく、彼/彼女は意味「コマンドを実行してからで」 または「スクリプトに含める」が、私は彼の心を読み取ることができません(私は定期的にそれは彼が着ているだけのことであることができないということではありません デフレクタを読んで心を


4
formathddコマンドが存在するかどうか知りたい。待って、私はそれを実行して見るだけです。ねえ。ありがとう:)
ジェフリーホセ

5
おそらく「どっち」を使う方が安全でしょう。
ゼブラ

これがSuper UserではなくStack Overflowであることを考えると、プログラムによる回答がより適切です。
Toby Speight 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.