从标准输入流中读取并执行shell指定函数
巧妙的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
} "$@"
一个完美的脚本就出现了!将每一行的前两个字符去掉,
- 使用 '<<EOF' 和 'EOF' 完美的将原来的配置放到多行注释里,
- 将原来使用 '# ' 注释掉的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指定函数的更多相关文章
- 也谈matlab中读取视频的一个重要函数mmreader
也谈matlab中读取视频的一个重要函数mmreader 在matlab中输入help mmreader来查阅一下该函数,有如下信息: MMREADER Create a multimedia rea ...
- 从hivesql结果中读取数值到shell变量的方法
为了检查hive表中的数据,并统计展现,需要将查出的结果传入到shell变量,然后统一输出到文本. 最后使用了以下两个方法: 方法一 QUAN=$(hive -S -e "select co ...
- expect中使用exec执行shell命令
今天想在expect脚本中获取本机ip,执行脚本是报错,脚本如下: set localip [exec ifconfig eth0 | grep Mask | cut -d: -f2 | awk '{ ...
- python从excel中读取数据传给其他函数使用
首先安装xlrd库 pip install xlrd 方法1: 表格内容如下: 场景描述,读取该表格A列数据,然后打印出数据 代码何解析如下: import xlrd #引入xlrd库 def exc ...
- Java实践 — SSH远程执行Shell脚本(转)
原文地址:http://www.open-open.com/lib/view/open1384351384024.html 1. SSH简介 SSH是Secure Shell的缩写,一 ...
- Java实践 — SSH远程执行Shell脚本
1. SSH简介 SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接 ...
- Jmeter 5.1 从excel读取数据执行接口自动化
思路:数据在excel文件中进行维护,然后转换成csv格式,jme中读取数据执行: 1.将接口各数据在excel文件中进行维护,然后存为csv格式,我的数据如下: 2.jmeter脚本,配置csv文件 ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...
- python中执行shell的两种方法总结
这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...
随机推荐
- JavaScript正则进阶之路——活学妙用奇淫正则表达式
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 有些童鞋肯定 ...
- 如何使用Flannel搭建跨主机互联的容器网络
当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因. 跨主机容器互联 下图描述了一个简单的集群网络,在该集群内,有两 ...
- Anaconda安装tensorflow和keras(gpu版,超详细)
本人配置:window10+GTX 1650+tensorflow-gpu 1.14+keras-gpu 2.2.5+python 3.6,亲测可行 一.Anaconda安装 直接到清华镜像网站下载( ...
- jboss 7.1.1.final 报错 set the maxParameterCount attribute on the Connector
Therefore, I cannot just add the connector attribute in standalone.xml like so: 在 <JBOSS_HOME> ...
- getHibernateTemplate出现的所有find方法的总结
文章转自:http://www.cnblogs.com/DarrenChan/p/5528194.html 一.find(String queryString); 示例:this.getHiberna ...
- 什么是机器学习的特征工程?【数据集特征抽取(字典,文本TF-Idf)、特征预处理(标准化,归一化)、特征降维(低方差,相关系数,PCA)】
2.特征工程 2.1 数据集 2.1.1 可用数据集 Kaggle网址:https://www.kaggle.com/datasets UCI数据集网址: http://archive.ics.uci ...
- matplotlib---legend图例
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 50) y1 = 2 * x + 1 y2 = x ...
- linux磁盘概述
硬盘简史 世界上第一块硬盘出生在1956年,至今已有61年半个多世纪的历史.它由IBM公司制造,世界上第一块硬盘:350RAMAC.盘片直径为24英寸,盘片数为50片,重量则是上百公斤,相当于两个冰箱 ...
- 小程序容器技术,App热更新与敏捷开发新方案
作为追求代码洁癖的软件工程师,我们对"紧耦合"的技术实现可以说是深恶痛绝.要解决当前企业移动端App日益沉重.难以真正迭代.投入产出比低的问题,首先在技术架构上要实现真正的&quo ...
- Problem N: 输出回字形
这个题如果用for循环直接做的话恐怕得做上几个小时吧,加上一点小技巧,用坐标法来写这个题.就像下面这样: 坐标原点不在矩形的角上,而在矩形的中心处,这只是算是一个技巧,理解起来好理解而已.