現在のパスにあるすべてのファイル/実行可能なバイナリを一覧表示するために "ls -la"スタイルコマンドを実行する "簡単な"方法はありますか?
(未知の接頭辞がありますが、基本的に既知の「名前」を持つコマンドを見つけるために出力をgrepにパイピングする予定です。この場合、bashのオートコンプリート/タブは基本的に役に立ちません。機能です。」
答え1
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
答え2
これはディレクトリの内容を一覧表示する機能です$PATH
。引数が渡されると、関数は名前に引数の1つを含むコマンドのみを一覧表示します。パラメータはグローバルパターンとして解釈されます。
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
多くのものと同様に、zshではこれが簡単です。
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
^
文字パラメータ拡張配列に関連付けられたテキストがpath=(/bin /usr/bin); echo $^path/foo
printsなどの各配列要素に追加されるようにします/bin/foo /usr/bin/foo
。
/*$^@*
喜劇的な侮辱のように見えますが、実際には通常の文字/
、ワイルドカード*
、修飾子を持つ特別なパラメータ$@
(位置パラメータの配列)などです^
。 ~である*
(N:t)
グローバル予選 N
一致するものがない場合は空の拡張子を取得します。履歴修飾子 t
各ゲームのデフォルト名(「tail」)のみが保持されます。
もっと奇妙なことに、外部の電話を避けることは表面的な関心だけです。
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
実際、あなたが探しているかもしれませんapropos
キーワードを含むコマンドの簡単な説明をマニュアルページで検索するコマンドです。 1つの制限は、マニュアルページがあるコマンドのみを見つけることができることです。
答え3
function findinpath () {
OLDIFS="$IFS" ;
IFS="$(printf ':\t\n')" ;
for regexp in "$@" ; do
for adir in $PATH ; do
find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
done ;
done ;
IFS="$OLDIFS" ;
}
この照会は一致するもののみを照合します。 1つ以上の「x」(実行可能)ビットがセットされており、これはディレクトリではない。
そして、それを正規表現リストと一緒に使用して、次のものを見つけます。
findinpath awk sed '\.sh$'
答え4
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done
まず、sedにecho$PATH
して ":"を ""に置き換えます。
次に、rwxを含むファイルを見つけ、エコーするために各エントリを検索します。
2> /dev/null
これにより、find
印刷エラーが発生しません。