【问题标题】:How does one create a wrapper around a program?如何围绕程序创建包装器?
【发布时间】:2020-02-22 21:00:26
【问题描述】:

我想学习在 linux 中为程序创建包装器。如何做到这一点?教程参考网页/链接或示例就可以了。为了阐明我想学习的内容,我将举例说明。

我使用 vim 来编辑文本文件。并使用 rcs 作为我的简单修订控制系统。 rcs 允许您签入和签出文件。我想创建一个名为 vir 的变形程序,当我在 shell 中键入:

$ vir temp.txt

将使用ci -u temp.txt 将文件 temp.txt 加载到 rcs 中,然后允许我使用 vim 编辑文件。

当我退出并返回时,它需要先检查文件,使用 ci -u temp.txt 并允许我像通常使用 vim 一样编辑文件,然后当我保存并退出时,它应该使用co -u temp.txt 签入文件,作为其中的一部分,我应该能够添加版本控制注释。

基本上,我想要在命令行上做的就是:

$ vir temp.txt

就像使用 vim 一样。包装器应该为我处理版本控制。

【问题讨论】:

  • 这通常是别名、函数、脚本或编译程序的用途。任何你可以编写程序的方式,你都可以做到这一点。

标签: vim wrapper rcs


【解决方案1】:

看看 rcsvers.vim,一个用于在 RCS 中自动保存版本的 vim 插件;你可以修改它。 vim.org 上还有其他用于 vim 的 RCS 插件

【讨论】:

  • 谢谢。我将研究这些插件,因为它提供的功能比我可能为自己创建的更好。我仍然想学习如何自己创建包装器,所以我也想学习。
【解决方案2】:

我有一个包装器来增强 ping 命令(使用 zsh),它可以帮助你:

# ping command wrapper - Last Change: out 27 2019 18:47
# source: https://www.cyberciti.biz/tips/unix-linux-bash-shell-script-wrapper-examples.html
ping(){
    # Name: ping() wrapper
    # Arg: (url|domain|ip)
    # Purpose: Send ping request to domain by removing urls, protocol, username:pass using system /usr/bin/ping
    local array=( $@ )          # get all args in an array
    local host=${array[-1]}     # get the last arg
    local args=${array[1,-2]}   # get all args before last arg in $@
    #local _ping="/usr/bin/ping"
    local _ping="/bin/ping"
    local c=$(_getdomainnameonly "$host")
    [ "$host" != "$c" ] && echo "Sending ICMP ECHO_REQUEST to \"$c\"..."
    # pass args and host
    # $_ping $args $c
    # default args for ping
    $_ping -n -c 2 -i 1 -W1 $c
}

_getdomainnameonly(){
    # Name: _getdomainnameonly
    # Arg: Url/domain/ip
    # Returns: Only domain name
    # Purpose: Get domain name and remove protocol part, username:password and other parts from url
    # get url
    local h="$1"
    # upper to lowercase
    local f="${h:l}"
    # remove protocol part of hostname
    f="${f#http://}"
    f="${f#https://}"
    f="${f#ftp://}"
    f="${f#scp://}"
    f="${f#scp://}"
    f="${f#sftp://}"
    # Remove username and/or username:password part of hostname
    f="${f#*:*@}"
    f="${f#*@}"
    # remove all /foo/xyz.html*
    f=${f%%/*}
    # show domain name only
    echo "$f"
}

它使用名为“ping”的函数隐藏本地 ping,因此如果您的脚本在路径上具有优先权,它首先会找到函数 ping。然后在脚本中定义一个名为 ping 的内部变量,它指向真正的 ping 命令:

 local _ping="/bin/ping"

您还可以注意到 args 存储在一个数组中。

【讨论】:

  • 我想这就是我想要的。这是 C 代码还是 bash?看起来它是bash。我需要解释/详细说明这些代码行的作用:local _ping="/bin/ping" #it seems like $_ping gets replaced by /bin/ping. Is this true in c?local c=$(_getdomainnameonly "$host") #looks like you are doing an eval of sorts. where you are calling the function getdomainnameonly() and passing variable $host$_ping -n -c 2 -i 1 -W1 $c #assume -n, -c 2, -i 1, -W1 are standard ping flags?
  • 我从未在“C”中测试过这段代码,但是是的,$_ping 替换了/bin/ping。 getdomainnameonly 会删除除目标站点的域之外的所有内容。只要我很久以前写过这段代码,但这些都是为了让ping更快。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 2021-03-26
  • 2019-01-21
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多