Linux 下可以将一些常用的操作定义为 Shell 函数,在登录时加载,就可以在终端直接以命令行的方式执行,
这样可以提升操作的效率。
直接看代码:
-
##! @TODO : 打印scp、rsync命令路径参数
-
##! @IN : $1 => 需copy的文件或路径
-
##! @OUT : user@hostname:file_path
-
function genScpPath(){
-
log_init "$HOME" "shTls" "" "2"
-
local filePath="$1"
-
local hostName="$(hostname)"
-
local userName="$(whoami)"
-
-
if [[ -n "$filePath" ]]
-
then
-
if [[ -d "$filePath" ]] || [[ -f "$filePath" ]]
-
then
-
echo "${userName}"'@'"${hostName}"':'"$(readlink -f ${filePath})"
-
else
-
log_fatal "${BASH_SOURCE[0]-$0}" "${FUNCNAME}" "$filePath' not a real path.'"
-
fi
-
else
-
echo "${userName}"'@'"${hostName}"':'"$(pwd)"
-
fi
-
}
-
-
##! @TODO : 查找类名定义位置
-
##! @IN : $1 类名
-
##! @IN : $2 查找目录
-
function grepClass(){
-
local className=$1
-
shift 1
-
local dirPath="$@"
-
[ -z "$dirPath" ] && { dirPath=$(pwd); echo -e $(yellowPrint "NOTICE: ")"\c"; greenPrint "search in ${dirPath}"; }
-
fgrep -n -w "${className}" -r ${dirPath} | egrep --color "class *${className}"
-
}
-
-
##! @TODO : 查找动态库文件位置
-
##! @IN : 动态库文件名
-
##! @OUT : 动态库文件路径
-
function getSoPath(){
-
local soFilePath="$1"
-
-
local soFileDict="/etc/ld.so.cache"
-
if [[ -n "$soFileDict" ]]
-
then
-
# 先查询 LD_LIBRARY_PATH
-
find $(echo $LD_LIBRARY_PATH | sed 's/\:/\n/g') -name "*.so.*" | /bin/grep --color "/${soFilePath}"
-
strings "$soFileDict" | /bin/grep --color "/${soFilePath}"
-
fi
-
}
-
-
##! @TODO : Linux下查找宏定义
-
##! @IN : $1 查找的目录
-
##! @IN : $2 要查找的宏
-
##! @OUT : 宏所在的文件
-
function searchMarco(){
-
if (($# != 2))
-
then
-
echo "Fail,need more arguments."
-
exit -1
-
fi
-
local marco=$2
-
local find_dir=$1
-
find $1 -name *.h 2>/dev/null | while read file_h
-
do
-
if grep $2 $file_h
-
then
-
echo $file_h
-
fi
-
done
-
return 0
-
}
-
-
##! @TODO : 快速备份文件
-
##! @IN : $1 待备份文件
-
##! @IN : $2 备份目录,可以不设置,则备份至当前目录
-
function backupFile(){
-
local l_file="$1"
-
local l_back_dir="$2"
-
! [ -f "$l_file" ] && { echo "Error: file to backup not exist." ; return 1; }
-
tar -zcf "${l_file%/}.tar.gz" ${l_file}
-
if [ -n "${l_back_dir}" ]
-
then
-
mkdir -p ${l_back_dir}
-
mv "${l_file}.tar.gz" ${l_back_dir}
-
fi
-
return 0
-
}
将以上脚本写入文件 shTls.sh,接下来怎样能使上面脚本中定义的函数在终端中作为命令直接调用?
类似这样:
$ genScpPath shTls.sh
方法一:
在.bashrc 文件中,加上 source shTls.sh,再source .bashrc 立即生效。
当然,如果脚本中调用了另一个脚本文件(我们暂且称它为B脚本)中定义的函数,则需要 source 该脚本。
可以在 .bashrc 文件中source,当然这种方式会使B脚本中定义的函数也能在终端中直接用命令行的形式调用。
如果你不想这样,则可以在shTls.sh脚本中source。
注意:shTls.sh脚本中,使用了我在《Shell 脚本 日志库》一文中讲述的日志库,在执行之前,需要将该日志库的代码也要做source操作。
方法二:
用别名的方式,在 .bashrc 文件中加入以下代码,然后source生效。
alias genScpPath='sh /home/sunny/shell/tools/shTls.sh genScpPath'
类似的,你可以设置其他函数的别名。
另外,还需要在脚本 shTls.sh 最后加入:
-
${funcName}=$1
-
shif 1
-
${funcName} $@
经过上面的设置,你就可以执行:
$ genScpPath shTls.sh
输出:
sunny@hostname:/home/sunny/shell/tools/shTls.sh
Copy 或 在scp、rsync 命令中直接做 命令替换,是不是很方便。
BTW:
你可能想到了,既然都写脚本了,又何必不将以上的安装方法自动化。
哈哈,你一定是跟我一样比较懒的人^_^,能让机器去做的事情,我们当然不必让它闲着。
你可以在 shTls.sh 中定义一个 install 函数,然后以如下的方式去调用:
sh shTls.sh install
这里就可以看出,上述的方法二会更适合些。
至于怎么实现 install,你可以试试。
_______________________
END
阅读(1812) | 评论(0) | 转发(0) |