1

(all)に似typeたオプション (follow) で呼び出すことを想像します。-f-a

ここに私の質問があります:

  1. bashコマンドを実行する方法を出力するための Bash 組み込みはありますか?
  2. シェルがコマンドを実行する方法を出力する Linux ユーティリティはありますか?
  3. 私が使用している以下のシェル関数を簡略化できますか?

次の定義と/usr/local/bin/lsへのリンクを考えると/usr/bin/ls:

alias ls="\ls -h --color=auto"
alias lsa="ls -A"
alias lsh="lsa -I'*'"

rcommand lshプリント:

alias lsh='lsa -I'\''*'\'''
alias lsa='ls -A'
alias ls='\ls -h --color=auto'
link /usr/local/bin/ls
file /usr/bin/ls

.bashrc ファイルで定義したシェル関数は次のとおりです。

function rcommand {
  declare -r a="${1#\\}"
  declare -r b="$(type -t "$a")"
  if [[ "$b" == alias && "$a" == "$1" ]]; then
    declare -r c="$(command -v "$a")"
    echo "$c"
    declare -r d="$(echo "$c" | sed "s/^.*='\\\\\\?\(\w\+\).*$/\1/")"
    if [[ "$d" == "$a" ]]; then
      rcommand  "\\$d"
    else
      rcommand  "$d"
    fi
  elif [[ "$b" == builtin || "$b" == function || "$b" == keyword ]]; then
    echo "$b $a"
  else
    declare -r c="$(declare -F "$a")"
    if [[ "$c" == "$a" ]]; then
      echo "function $a"
    else
      declare -r d="$(type -P "$a")"
      if [[ -h "$d" ]]; then
        echo "link $d"
        rcommand "$(readlink "$d")"
      elif [[ -e "$d" ]]; then
        echo "file $d"
      fi
    fi
  fi
}
4

1 に答える 1

1

および/またはでコマンドset -xトレースすることを意味しましたか?bashsh

とにかく、あなたのスクリプトはきれいでいいようです。いくつかの選択肢がある私のバージョンがあります...

function rcommand() {
  local b="$(type -t "$1")"
  case $b in
    alias )
          local c="$(command -v "$1")"
          echo $c
          local d=$(sed "s/^.*='\?\([^ ]\+\) .*$/\1/" <<<$c)
          if [[ "$d" == "$1" ]]; then
              rcommand  "\\$d"
          else
              rcommand  "$d"
          fi
          ;;
      builtin | function | keyword )
          echo "$b $1"
          ;;
      * )
          local a="${1#\\}"
          local c="$(declare -F "$a")"
          if [[ "$c" == "$a" ]]; then
              echo "function $a"
          else
              local d="$(type -P "$a")"
              if [ -h "$d" ]; then
                  echo "link $d"
                  rcommand "$(readlink "$d")"
              elif [ -e "$d" ]; then
                  echo "file $d"
              fi
          fi
  esac
}
于 2012-11-11T14:05:44.830 に答える