gnu, bsd 명령의 차이를 흡수
환경적인 사람도 많죠.
이런 상황에서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
Reference
이 문제에 관하여(gnu, bsd 명령의 차이를 흡수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/oto/articles/788f322a3464fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)