巧妙的ohmytmux配置

oh my tmux的配置,发现他们很巧妙的将配置和shell函数放到一个文件里

比如切换鼠标模式的相关配置和shell函数,

# : << EOF
# ...省略其他配置文件信息
# toggle mouse
bind m run "cut -c3- ~/.tmux.conf | sh -s _toggle_mouse"
# EOF
#
# _toggle_mouse() {
# old=$(tmux show -gv mouse)
# new=""
#
# if [ "$old" = "on" ]; then
# new="off"
# else
# new="on"
# fi
#
# tmux set -g mouse $new
# }
#
# "$@"

主要功能时 将m键绑定上   cut -c3- ~/.tmux.conf | sh -s _toggle_mouse

cut命令切换注释

第一个巧妙的地方时   cut -c3- ~/.tmux.conf ,此命令运行的结果是

: << EOF
...省略其他配置文件信息
toggle mouse
nd m run "cut -c3- ~/.tmux.conf | sh -s _toggle_mouse"
EOF _toggle_mouse() {
old=$(tmux show -gv mouse)
new="" if [ "$old" = "on" ]; then
new="off"
else
new="on"
fi tmux set -g mouse $new
} "$@"

一个完美的脚本就出现了!将每一行的前两个字符去掉,

  1. 使用  '<<EOF'  和  'EOF'  完美的将原来的配置放到多行注释里,
  2. 将原来使用 '# '  注释掉的shell函数 打开

sh执行命令

从sh的文档中可以看到 -s 使用执行标准输入里执行命令

OPTIONS
-s Read commands from the standard input.
STDIN
The standard input shall be used only if one of the following is true: * The -s option is specified. * The -c option is not specified and no operands are specified. * The script executes one or more commands that require input from standard input (such as a read command that does not redirect its input). See the INPUT FILES section. When the shell is using standard input and it invokes a command that also uses standard input, the shell shall ensure that the standard input file pointer
points directly after the command it has read when the command begins execution. It shall not read ahead in such a manner that any characters intended to be
read by the invoked command are consumed by the shell (whether interpreted by the shell or not) or that characters that are not read by the invoked command are
not seen by the shell. When the command expecting to read standard input is started asynchronously by an interactive shell, it is unspecified whether charac‐
ters are read by the command or interpreted by the shell. If the standard input to sh is a FIFO or terminal device and is set to non-blocking reads, then sh shall enable blocking reads on standard input. This shall
remain in effect when the command completes.

执行指定函数

从sh的man文档里没有看出来可以指定执行脚本里的哪个函数呢,ohmytmux怎么让sh知道执行哪个函数的呢?

注意到cut后的脚本没,最后一行是  "$@"

在shell中$@用来获得脚本的所有入参,所以   cut -c3- ~/.tmux.conf | sh -s _toggle_mouse 执行的真正脚本时

: << EOF
...省略其他配置文件信息
toggle mouse
nd m run "cut -c3- ~/.tmux.conf | sh -s _toggle_mouse"
EOF _toggle_mouse() {
old=$(tmux show -gv mouse)
new="" if [ "$old" = "on" ]; then
new="off"
else
new="on"
fi tmux set -g mouse $new
} _toggle_mouse

这样是不是很明了了,

脚本第一行的  ':' 是shell中的空命令占位符,它什么也不干,永远返回0

<<EOF   到  EOF定义了一个多行文本,这个多行文本没有人用, 相当于把原来的配置都注释掉了

接着 定义一个名字为_toggle_mouse的函数

最后一行  执行该行数

这就是另一个巧妙的地方, 将要执行的函数名当做参数传给shell,并通过$@将 指定的函数 放到最后一样

通过这种方式我们就可以方便的执行shell中指定的函数了

参考

oh my tmux github : https://github.com/gpakosz/.tmux

从标准输入流中读取并执行shell指定函数的更多相关文章

  1. 也谈matlab中读取视频的一个重要函数mmreader

    也谈matlab中读取视频的一个重要函数mmreader 在matlab中输入help mmreader来查阅一下该函数,有如下信息: MMREADER Create a multimedia rea ...

  2. 从hivesql结果中读取数值到shell变量的方法

    为了检查hive表中的数据,并统计展现,需要将查出的结果传入到shell变量,然后统一输出到文本. 最后使用了以下两个方法: 方法一 QUAN=$(hive -S -e "select co ...

  3. expect中使用exec执行shell命令

    今天想在expect脚本中获取本机ip,执行脚本是报错,脚本如下: set localip [exec ifconfig eth0 | grep Mask | cut -d: -f2 | awk '{ ...

  4. python从excel中读取数据传给其他函数使用

    首先安装xlrd库 pip install xlrd 方法1: 表格内容如下: 场景描述,读取该表格A列数据,然后打印出数据 代码何解析如下: import xlrd #引入xlrd库 def exc ...

  5. Java实践 — SSH远程执行Shell脚本(转)

    原文地址:http://www.open-open.com/lib/view/open1384351384024.html 1. SSH简介         SSH是Secure Shell的缩写,一 ...

  6. Java实践 — SSH远程执行Shell脚本

    1. SSH简介         SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接 ...

  7. Jmeter 5.1 从excel读取数据执行接口自动化

    思路:数据在excel文件中进行维护,然后转换成csv格式,jme中读取数据执行: 1.将接口各数据在excel文件中进行维护,然后存为csv格式,我的数据如下: 2.jmeter脚本,配置csv文件 ...

  8. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...

  9. python中执行shell的两种方法总结

    这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...

随机推荐

  1. 利用Charles做代理测试电脑上写的H5页面

    做H5页面的同学可能经常会遇到一个场景,就是电脑上调试好的页面怎么在手机上访问测试呢? 下面就介绍一种自己经常使用的方式,利用Charles代理软件来实现! 安装Charles 直接去官网下载对应的系 ...

  2. c++实现状态模式

    实验:用Java代码模拟实现课堂上的"银行账户"的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化. 由于是c++,不像java那么灵活,所以类的调用方 ...

  3. jsp+servlet上传excel并将数据导入到数据库表的实现方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. 带UI的小初高数学学习软件—艰难地用C++(QT库)实现的过程

    从互相了解对方的代码思路然后确定用C++编写,到用win32写界面时变得摇摆不定的考虑着要不要改变语言,再到用QT写完界面后发现短信接口一般都不提供C++,最后到QT打包出来的可执行文件在别的设备上无 ...

  5. I/O 引脚

    我们以网卡举例 引脚,芯片,pcb板之间的关系非常紧密 1.引脚,又叫管脚,英文叫Pin. 就是从集成电路(芯片)内部电路引出与外围电路的接线,所有的引脚就构成了这块芯片的接口.引线末端的一段,通过软 ...

  6. Cookie与Session、CBV添加装饰器

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  7. 时序数据库influxDB介绍

    https://www.jianshu.com/p/68c471bf5533 https://www.cnblogs.com/wzbk/p/10569683.html

  8. IP协议/地址(IPv4&IPv6)概要

    IP协议/地址(IPv4&IPv6)概要 IP协议 什么是IP协议 IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. [1] 协议的特征 无连 ...

  9. WEB安全信息收集

    目录 信息收集 子域名&敏感信息 敏感信息收集--Googlehack 敏感信息收集--收集方向 空间测绘引擎域名资产收集 子域名收集 WEB指纹 端口扫描 IP查询 cms识别 WAF识别 ...

  10. 攻防世界-MISC:Aesop_secret

    这是攻防世界高手进阶区的的第九题,题目如下: 点击下载附件一,得到一个压缩包,解压后得到一张GIF动图,找个网站给他分解一下,得到如下图片 不知道是什么意思,所以就跑去看WP了,用010editor打 ...