2017-07-03 5 views
2

このスクリプトを使用して、システム上のマニュアルページで使用可能なコマンドのリストを生成しています。 timeでこれを実行すると、コンピュータに平均約49秒の時間が表示されます。マニュアルページで使用可能なコマンドを一覧表示するスクリプトを最適化する

#!/usr/local/bin/bash 

for x in $(for f in $(compgen -c); do which $f; done | sort -u); do 
    dir=$(dirname $x) 
    cmd=$(basename $x) 
    if [[ ! $(man --path "$cmd" 2>&1) =~ 'No manual entry' ]]; then 
     printf '%b\n' "${dir}:\n${cmd}" 
    fi 
done | awk '!x[$0]++' 

高速化のために最適化する方法はありますか?

これは私の現在の出力の小さなサンプルです。目標はディレクトリごとにコマンドをグループ化することです。これは後で配列に供給されます。

/bin: # directories generated by $dir 
[  # commands generated by $cmd (compgen output) 
cat 
chmod 
cp 
csh 
date 

答えて

0

ここでは、組み込み関数の完全な無視について説明します。とにかく、それはwhichです。スクリプトは完全にテストされていません。両方のバージョンの

$ export PATH=/usr/local/bin:/usr/bin 
$ time (sh ./opti.sh &>/dev/null) 

real 0m3.577s 
user 0m0.843s 
sys  0m2.671s 

$ time (sh ./orig.sh &>/dev/null) 

real 2m10.662s 
user 0m20.138s 
sys  1m5.728s 

(警告:切り捨てPATHとCygwinの上

#!/bin/bash 
shopt -s nullglob # need this for "empty" checks below 
MANPATH=${MANPATH:-/usr/share/man:/usr/local/share/man} 
IFS=: # chunk up PATH and MANPATH, both colon-deliminated 

# just look at the directory! 
has_man_p() { 
    local needle=$1 manp manpp result=() 
    for manp in $MANPATH; do 
     # man? should match man0..man9 and a bunch of single-char things 
     # do we need 'man?*' for longer suffixes here? 
     for manpp in "$manp"/man?; do 
      # assumption made for filename formats. section not checked. 
      result=("$manpp/$needle".*) 
      if ((${#result[@]} > 0)); then 
       return 0 
      fi 
     done 
    done 
    return 1 
} 

unset seen 
declare -A seen # for deduplication 
for p in $PATH; do 
    printf '%b:\n' "$p" # print the path first 
    for exe in "$p"/*; do 
     cmd=${exe##*/} # the sloppy basename 
     if [[ ! -x $exe || ${seen[$cmd]} == 1 ]]; then 
      continue 
     fi 
     seen["$cmd"]=1 
     if has_man_p "$cmd"; then 
      printf '%b\n' "$cmd" 
     fi 
    done 
done 

時間(Windowsとの完全な1は、元のバージョンのためにあまりにも多くのミスを持っている)Cygwinの/usr/binの中で最もものが付属しています.exe拡張子)

関連する問題