gnu, bsd 명령의 차이를 흡수

linux와 기타 unix, 예를 들어 맥 등 쌍방을 사용합니다
환경적인 사람도 많죠.
이런 상황에서gnu명령일까,bsd명령일까,항상 혼란스러워요.
또한 리눅스에서 데비안 계열은 가wk가 아니라 마wk의 적은 기능이지만 속도가 개선되었다
awk를 사용하고 있습니다.일반 종목에서는 mawk가 아니면 안 돼요.
차라리 가wk에서 사용하고 싶은 함수는 사용할 수 없는 폐단이 더 크기 때문에 이것도 가wk로 대체한다.
대부분의 경우gnu 지령은 사용하기에 비교적 편리하다
소스 코드도 간결해야 한다.
이 두 지령의 차이를 흡수하는 방법을 써라.

방법


명령 이름의function을 정의합니다. 이 명령에서gnu 명령을 실행할 때
gnu 명령과 bsd 명령의 차이를 흡수할 수 있습니다.
alias를 통해 명령 이름을 정의한 후 상호작용 방식에서만 유효합니다
파일을 읽고 실행할 수 없기 때문에 function 정의 방법만 사용할 수 있습니다.
다음 함수 좋겠죠?
예제
function sed {
  gsed "$@"
}
또한 이 덮어쓰기를 처리합니다.bashrc에 직접 쓰면 영향 범위가 너무 넓어요.
기존의 처리를 방해할 수 있다.
따라서gnu,bsd 명령만 읽을 때 흡수 처리
맘에 들 때 찢고 변경하는 처리가 있었으면 좋겠어요.
. 덮어쓰기 함수 그룹을 읽는 데 사용할 함수 정의를 bashrc에 쓸지 여부
소스가 함수 그룹의 파일을 읽으면 순조롭게 진행될 수 있습니까?
만약 이런 방법을 채택한다면, 하위 프로세스에서 흡수 차이를 읽더라도
부모나 다른 과정에 영향을 주지 않기 때문에 쉽게 사용할 수 있어야 한다.

소스 코드


$HOME/.bashrc
# 関数群を読み込むコマンド
source $HOME/bash/function/read_function
$HOME/bash/function/read_function
# $HOME/bash/function/配下のファイルをすべて読み込む関数
function read_function {

  local function_dir=$HOME/bash/function

  eval "$(
    ls ${function_dir} |
    grep -v .md |
    grep -v read_function |
    xargs -I {} echo source ${function_dir}/{};
  )"
  unset -f read_function
}

read_function
위 readfunction을 통해 읽습니다.
$HOME/bash/function/gnu_alias
#!/bin/bash
#
# gnu command util.

#######################################
# set alias gnu command for Mac and BSD.
# Globals:
#   GNU_ALIAS
# Arguments:
#   None
# Outputs:
#   None
# Returns:
#   0 if  set alias, non-zero on error.
# Example:
#   gnu_alias # => you use use sed
#######################################
function gnu_alias {
    for arg in "$@"; do
    case "$arg" in
      -h|--help)
        function usage() {
          cat 1>&2 << END
gnu_alias
output search engine setting

USAGE:
    gnu_alias [FLAGS] [OPTIONS]

FLAGS:
    -h, --help              Prints help information

OPTIONS:
    --debug                 Set bash debug Option
END
          unset -f usage
        }
        usage
        return
        ;;
      --debug)
        # set debug
        set -x
        trap "
          set +x
          trap - RETURN
        " RETURN
        ;;
      *)
        ;;
    esac
  done

  # you use Darwin, set alias for use Gnu sed, awk, xargs
  if uname | grep -e Darwin -e BSD > /dev/null; then
    if ! gnu_exists; then
      echo "Any Gnu command is not exists." >&2
      return 1
    fi

    function getopt {
      if uname | grep -e Open > /dev/null; then
        # openbsd
        /usr/local/bin/gnugetopt "$@"
      elif uname | grep -e Free > /dev/null; then
        # freebsd
        /usr/local/bin/getopt "$@"
      elif uname | grep -e Darwin > /dev/null; then
        # macos
        # darwin
        /usr/local/opt/gnu-getopt/bin/getopt "$@"
      fi
    }
    
    # alias not using shellscript in norepl.
    # and using function for alternative alias.
    function sed {
      gsed "$@"
    }
    function awk {
      gawk "$@"
    }
    function xargs {
      gxargs "$@"
    }
    function find {
      gfind "$@"
    }
    function date {
      gdate "$@"
    }
    function cut {
      gcut "$@"
    }
    function df {
      gdf "$@"
    }

    export GNU_ALIAS=yes
  # debian default awk is mawk.
  # alias gawk.
  elif ls /etc | grep debian_version >> /dev/null; then
    if ! gnu_exists; then
      echo "Any Gnu command is not exists." >&2
      return 1
    fi
    function awk {
      gawk "$@"
    }
    export GNU_ALIAS=yes
  fi
}

#######################################
# check exists gnu command alias gnu command for Mac and BSD.
# gsed, gawk, gxargs, gfind, ... and many
# Globals:
#   None
# Arguments:
#   None
# Outputs:
#   None
# Returns:
#   0 if exists gnu commands, non-zero on error.
# Example:
#   gnu_exists # => you use use sed
#######################################
function gnu_exists {
  # you use Darwin, set alias for use Gnu sed, awk, xargs
  if uname | grep -e Darwin -e BSD > /dev/null; then
    # gsedがなかったら、return 1

    # gnu-getopt
    if uname | grep -e Open > /dev/null; then
      # openbsd
      if ! type "/usr/local/bin/gnugetopt" > /dev/null; then
        echo "gnu-getopt is not exists." >&2
        return 1
      fi
    elif uname | grep -e Free > /dev/null; then
      # freebsd
      if ! type "/usr/local/bin/getopt" > /dev/null; then
        echo "gnu-getopt is not exists." >&2
        return 1
      fi
    elif uname | grep -e Darwin > /dev/null; then
      # macos
      # darwin
      if ! type "/usr/local/opt/gnu-getopt/bin/getopt" > /dev/null; then
        echo "gnu-getopt is not exists." >&2
        return 1
      fi
    else
      echo "unknown Unix!" >&2
      return 1
    fi

    if ! type "gsed" > /dev/null; then
      echo "gsed is not exists." >&2
      return 1
    fi
    if ! type "gawk" > /dev/null; then
      echo "gawk is not exists." >&2
      return 1
    fi
    if ! type "gxargs" > /dev/null; then
      echo "gxargs is not exists." >&2
      return 1
    fi
    if ! type "gfind" > /dev/null; then
      echo "gfind is not exists." >&2
      return 1
    fi
    if ! type "gdate" > /dev/null; then
      echo "gdate is not exists." >&2
      return 1
    fi
    if ! type "gcut" > /dev/null; then
      echo "gcut is not exists." >&2
      return 1
    fi
    if ! type "gdf" > /dev/null; then
      echo "gdf is not exists." >&2
      return 1
    fi
  # you use debian distribution, set alias awk.
  elif ls /etc | grep debian_version >> /dev/null; then
    if ! type "gawk" > /dev/null; then
      echo "gawk is not exists." >&2
      return 1
    fi
  fi
}

#######################################
# unalias gnu command for Mac.
# Globals:
#   GNU_ALIAS
# Arguments:
#   None
# Outputs:
#   None
# Returns:
#   0 if thing was deleted, non-zero on error.
# Example:
#   gnu_unalias # => you use use sed
#######################################
function gnu_unalias {
  # you use Darwin, set alias for use Gnu sed, awk, xargs
  if uname | grep -e Darwin -e BSD > /dev/null; then
    unset -f getopt
    unset -f sed
    unset -f awk
    unset -f xargs
    unset -f find
    unset -f date
    unset -f cut
    unset -f df
    unset GNU_ALIAS
  fi
  # you use debian distribution, set alias awk.
  if ls /etc | grep debian_version >> /dev/null; then
    
    unset -f awk
    unset GNU_ALIAS
  fi
}

사용법


좋아할 때는 아래처럼 대화로 읽다가 아래처럼 찢어버리면 된다.
# overwrite bsd command to gnu command.
gnu_alias

# gnuコマンドに置き換わっているので-iでsedの上書きができる。
sed -i.org /etc/hoge

# gnuコマンドが上書きされているかどうかは下記の環境変数に入っている。
# これをもとに判断する。
echo $GNU_ALIAS

# 関数の上書き解除
gnu_unalias
도 다음과 같이 다른 케이스 스크립트에 병합할 수 있다.
g++find_include.sh
function g++find_include {

  source $(dirname $0)/../function/gnu_alias
  if ! gnu_alias; then
    return 1;
  fi
  ...
}

g++find_include

조개 스크립트 호출.
bash g++find_include.sh

최신 소스 코드


github

좋은 웹페이지 즐겨찾기