如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率,本文将通过实例的方式向你介绍 history 命令的 15 个用法。 |
当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身,如果你想要查看命令历史的时间戳,那么可以执行:
# export HISTTIMEFORMAT='%F %T ' # history | more 1 2008-08-05 19:02:39 service network restart 2 2008-08-05 19:02:39 exit 3 2008-08-05 19:02:39 id 4 2008-08-05 19:02:39 cat /etc/redhat-release
注意:这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令,都将会显示成设置 HISTTIMEFORMAT 变量的时间。
使用 Ctrl+R 搜索历史Ctrl+R 是我经常使用的一个快捷键,此快捷键让你对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到命令后,通常再按回车键就可以执行pre该命令,如果想对找到的命令进行调整后再执行,则可以按一下左或右方向键。
# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt] (reverse-i-search)`red‘: cat /etc/redhat-release [Note: Press enter when you see your command, which will execute the command from the history] # cat /etc/redhat-release Fedora release 9 (Sulphur)
有 4 种方法可以重复执行上一条命令:
1.使用上方向键,并回车执行。
2.按 !! 并回车执行。
3.输入 !-1 并回车执行。
4.按 Ctrl+P 并回车执行。
从命令历史中执行一个指定的命令
在下面的例子中,如果你想重复执行第 4 条命令,那么可以执行 !4:
# history | more 1 service network restart 2 exit 3 id 4 cat /etc/redhat-release # !4 cat /etc/redhat-release Fedora release 9 (Sulphur)
在下面的例子,输入 !ps 并回车,将执行以 ps 打头的命令:
# !ps ps aux | grep yp root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
将下面两行内容追加到 .bash_profile 文件并重新登录 bash shell,命令历史的记录数将变成 450 条:
# vi ~/.bash_profile HISTSIZE=450 HISTFILESIZE=450
默认情况下,命令历史存储在 ~/.bash_history 文件中,添加下列内容到 .bash_profile 文件并重新登录 bash shell,将使用 .commandline_warrior 来存储命令历史:
# vi ~/.bash_profile HISTFILE=/root/.commandline_warrior
在下面的例子中,pwd 命令被连续执行了三次。执行 history 后你会看到三条重复的条目,要剔除这些重复的条目,你可以将 HISTCONTROL 设置为 ignoredups:
# pwd # pwd # pwd # history | tail -4 44 pwd 45 pwd 46 pwd [Note that there are three pwd commands in history, after executing pwd 3 times as shown above] 47 history | tail -4 # export HISTCONTROL=ignoredups # pwd # pwd # pwd # history | tail -3 56 export HISTCONTROL=ignoredups 57 pwd [Note that there is only one pwd command in the history, even after executing pwd 3 times as shown above] 58 history | tail -4
上例中的 ignoredups 只能剔除连续的重复条目,要清除整个命令历史中的重复条目,可以将 HISTCONTROL 设置成 erasedups:
# export HISTCONTROL=erasedups # pwd # service httpd stop # history | tail -3 38 pwd 39 service httpd stop 40 history | tail -3 # ls -ltr # service httpd stop # history | tail -6 35 export HISTCONTROL=erasedups 36 pwd 37 history | tail -3 38 ls -ltr 39 service httpd stop [Note that the previous service httpd stop after pwd got erased] 40 history | tail -6
将 HISTCONTROL 设置为 ignorespace,并在不想被记住的命令前面输入一个空格:
# export HISTCONTROL=ignorespace # ls -ltr # pwd # service httpd stop [Note that there is a space at the beginning of service, to ignore this command from history] # history | tail -3 67 ls -ltr 68 pwd 69 history | tail -3
如果你想清除所有的命令历史,可以执行:
# history -c
在下面的例子里,!!:$ 将为当前的命令获得上一条命令的参数:
# ls anaconda-ks.cfg anaconda-ks.cfg # vi !!:$ vi anaconda-ks.cfg
补充:使用 !$ 可以达到同样的效果,而且更简单。下例中,!^ 从上一条命令获得第一项参数:
# cp anaconda-ks.cfg anaconda-ks.cfg.bak anaconda-ks.cfg # vi -5 !^ vi anaconda-ks.cfg
在下面的例子,!cp:2 从命令历史中搜索以 cp 开头的命令,并获取它的第二项参数:
# cp ~/longname.txt /really/a/very/long/path/long-filename.txt # ls -l !cp:2 ls -l /really/a/very/long/path/long-filename.txt
下例里,!cp:$ 获取 cp 命令的最后一项参数:
# ls -l !cp:$ ls -l /really/a/very/long/path/long-filename.txt
如果你想禁用 history,可以将 HISTSIZE 设置为 0:
# export HISTSIZE=0 # history # [Note that history did not display anything]
下面的例子,将忽略 pwd、ls、ls -ltr 等命令:
# export HISTIGNORE=”pwd:ls:ls -ltr:” # pwd # ls # ls -ltr # service httpd stop # history | tail -3 79 export HISTIGNORE=”pwd:ls:ls -ltr:” 80 service httpd stop 81 history [Note that history did not record pwd, ls and ls -ltr]
原文来自:http://linuxtoy.org/archives/history-command-usage-examples.html
本文地址:http://www.linuxprobe.com/history-15-cases.html
本文来自博客园,作者:linux_pro,转载请注明原文链接:http://www.cnblogs.com/linuxpro/p/17416153.html
Hi,我是行舟,今天和大家一起学习Go语言的字典。Go语言的字典又称为map,一种使用广泛的数据结构。它是拥有key/value对元素的「无序集合」,而且在集合中key必须是唯一的。声明和初始化声明一个字典的语法:var名字map[key的类型]value的类型 复制看几个实际的例子:packagemain import"fmt" funcmain(){ varm1map[string]int//声明 m2:=map[string]int{}//声明并初始化一个空的map m3:=make(map[string]int)//声明并初始化一个空的map m4:=make(map[string]string,2)//声明并初始化一个空的map fmt.Printf("m1=%+v\n",m1) fmt.Printf("m2=%+v\n",m2) fmt.Printf("m3=%+v\n",m3) fmt.Printf("m4=%+v\n",m4) } 复制声明一个字典主要包含「名字」「
01.什么是客户之声?客户之声(VoiceoftheCustomer,简称VoC)是消费者对于品牌、产品、服务等内容的反馈。根据国际知名研究机构Forrester的定义:“公司通过VoC项目收集和分析客户反馈,找到客户体验提升方向,并追踪提升效果。为了应对运行VoC项目所面临的复杂挑战,客户体验专家可以寻求不同供应商的帮助完成VoC项目的部分或全部内容。VoC是指收集、分析客户反馈数据,挖掘数据价值并用于指导商业决策的一整套方案。”我们在很多时候都需要做VoC,例如做市场、行业及产品调研时,在销售过程中,在售后服务过程中等等。VoC已经成为企业非常重要的一种工具而得到广泛应用,同时,VoC作为当下兴起的经济模式“客户体验管理(CustomerExperienceManagement,,简称CEM)”中不可或缺的组成部分,也显得尤为重要。数字化转型的浪潮正影响着用户,让他们产生多渠道、多类型的反馈数据。要了解客户体验就需要将分散在不同渠道的反馈数据进行整合分析,透过数据理解客户的需求痛点。从收集来的反馈数据里倾听客户的声音,并将其转化为可执行的商业见解是VoC的核心目的。02.客户之声的
SAPRETAIL商品LISTING方法之一该方法主要有三大步:创建Assortmentmodule,将Article号码与Assortmentmodule关联;然后创建Assortment;将Assortmentmodule分配给Assortment。展示如下:1,事务代码WSO1,创建一个AssortmentModule,回车,输入description,在ITEMS里输入物料号,如上图。保存,Module10000000201maintained.2,事务代码WSOA1创建一个generalassortment,进入Mat.Groups选项卡,输入相应的物料组。保存,AssortmentZAST002hasbeencreated.3,将AssortmentModule分配给Assortment.事务代码WSO5回车,将第二步里创建的AssortmentZAST002维护在Assignments数据里,如上图。保存,至此就完成了物料的Listing!不过这只是方式之一。-完-写于2021-10-10早上。
今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的。对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的最多的工具类了,也是面试中几乎必问的,LinkedList可能用的少点,但大多数的面试也会有所涉及,尤其是关于这两者的比较可以说是家常便饭,所以,无论从使用上还是在面试的准备上,对于这两个类的知识点我们都要有足够的了解。ArrayListArrayList是List接口的一个实现类,底层是基于数组实现的存储结构,可以用于装载数据,数据都是存放到一个数组变量中,transientObject[]elementData;复制transient是一个关键字,它的作用可以总结为一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。你可能会觉得奇怪,ArrayList可以被序列化的啊,源码可是实现了java.io.Serializable接口啊,为什么数组变量还要用transient定义呢?别急,关于这个问题,我们后面会讨论到,不卖个关子,你们怎么会看到最后,
概述谷歌官方推出了SwipeRefreshLayout来实现下拉刷新的效果。对比以前我们常用的pull-to-refesh,这个方案显得更加的简单方便。关联项目引用(管理依赖)在你的应用级别的build.gradle中添加如下:compile'com.android.support:appcompat-v7:23.0.0' compile'com.android.support:support-v4:23.0.0'复制编写布局(Layout)<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation=&q
笔者邀请您,先思考:1您熟悉那些学习算法?2您应用那些机器学习算法?本篇内容主要是面向机器学习初学者,介绍常见的机器学习算法,当然,欢迎同行交流。 哲学要回答的基本问题是从哪里来、我是谁、到哪里去,寻找答案的过程或许可以借鉴机器学习的套路:组织数据->挖掘知识->预测未来。组织数据即为设计特征,生成满足特定格式要求的样本,挖掘知识即建模,而预测未来就是对模型的应用。 特征设计依赖于对业务场景的理解,可分为连续特征、离散特征和组合高阶特征。本篇重点是机器学习算法的介绍,可以分为监督学习和无监督学习两大类。 无监督学习算法很多,最近几年业界比较关注主题模型,LSA->PLSA->LDA为主题模型三个发展阶段的典型算法,它们主要是建模假设条件上存在差异。LSA假设文档只有一个主题,PLSA假设各个主题的概率分布不变(theta都是固定的),LDA假设每个文档和词的主题概率是可变的。 LDA算法本质可以借助上帝掷骰子帮助理解,详细内容可参加Rickjin写的《LDA数据八卦》文章,浅显易懂,顺便也科普了很多数学知识,非常推荐。 监督学习可分为分类和回归,感知器是最
本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程.写在前面本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么代币Token如果不那么追求精确的定义,代币就是数字货币,比特币、以太币就是一个代币。 利用以太坊的智能合约可以轻松编写出属于自己的代币,代币可以代表任何可以交易的东西,如:积分、财产、证书等等。 因此不管是出于商业,还是学习很多人想创建一个自己的代币,先贴一个图看看创建的代币是什么样子。 今天我们就来详细讲一讲怎样创建一个这样的代币。ERC20Token也许你经常看到ERC20和代币一同出现,ERC20是以太坊定义的一个代币标准。 要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。 其接口如下:contractERC20Interface{ stringpublicconstantname="TokenName"; stringpublicconstantsymbol="SYM";
类加载时机:类从被加载到内存中开始,到卸载出内存为止,要经历7个阶段:加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类加载过程中必须按照这种顺序按部就班的开始(注意是“开始”,而不是“完成”,因为这些阶段通常是交叉进行的),而解析阶段不确定,解析阶段可以在初始化之前或之后进行,这也正是Java支持动态绑定的原因。什么情况下需要开始类加载的第一个阶段----加载,Java虚拟机没有强制约束,但Java虚拟机强制约束了类的初始化的开始时间(而加载、验证、准备自然在初始化之前进行),有且只有以下5种情况对类进行初始化:遇到new、getstatic、putstatic、invokestatic四个字节码命令时。这四条指令最常见的Java代码是:使用new关键字实例化对象、读取或设置一个类的静态字段、调用一个类的静态方法。使用java.lang.reflect包的方法对类进行反射调用时。当初始化一个类时,如果其父类还没有初始化,则需要先初始化父类。虚拟机启动时,虚拟机会先初始化主类(含有main()的哪个类)。当使用动态语言支持时(JDK1.7以上),如果一个Java.lang.in
运行时数据区:Java虚拟机的运行时数据区按照大的可以分为线程独立使用的数据区,和所有线程共享的数据区。一.线程独立使用数据区1.程序计数器程序计数器其实就是jvm里面的pc,他指向的都是字节码的偏移量,也就是下一条要执行的字节码当然这是jvm在执行java方法的时候,当程序在执行navtive方法的时候这时候起作用的其实是我们物理机上的pc此时jvm的pc是空值(undefine)并且这个地方也是所有的jvm内存区完全不会抛出OutOfMemary异常的位置2.虚拟机栈虚拟机栈其实也就是我们日常所说的堆栈中的栈他的生命周期是和当前的线程完全一样当在执行一个新的java方法的时候他会在java虚拟机栈创建一个栈帧。栈帧中存放的内容:局部变量表操作数栈动态链接方法的出入口局部变量表是一个非常重要的数据结构这里面存放的主要就是这个java方法中的局部变量。而这些变量都是在编译时期确定的。后来会看到其实在class中有一个code属性,这个属性里面会有一个Local_max他的作用就是计算当前的方法需要多少个Slot,并且注意这个Slot并不是局部变量有多少他就会产生多少,而是根据作用域对这
本篇从宏观上介绍surround360的算法流程和每个步骤的原理,主要参考surround360官方网页(见参考)上的介绍。Surround360开源项目包含了从相机阵列的硬件设计到图像拼接的软件算法,它在一个系统里实现了端到端的3D360°从视频拍摄到视频处理的过程。开源的目的就是为了促进3D360生态系统建设,不管是代码开发者还是内容制造者,所有人都可以自由地在开源系统的基础上进行改进、扩展、分发、合并等。Surround360硬件组装过程见这个视频:https://www.facebook.com/Engineering/videos/10154278617642200/必须要注意的是,为了保证高质量的输出效果,硬件设计和软件算法都非常重要。前篇介绍里讨论过硬件设计在降低连续视频处理时间的重要性。但是即使我们使用了高质量的光学镜头和精密的机械圆盘结构,没有经过软件校准的相机镜头之间仍然会有很大不同,这样输出的立体结果会出问题(比如重影或者伪3D)。图像拼接算法将17个相机拍摄的图片转换为适合VR设备观看的360°全景图像。该算法不但极大地降低了经典的3D360算法的处理时间,而且
解决python写入mysql中datetime类型遇到的问题 刚开始使用python,还不太熟练,遇到一个datetime数据类型的问题: 在mysql数据库中,有一个datetime类型的字段用于存储记录的日期时间值。python程序中有对应的一个datetime变量dt。 现在需要往mysql数据库中添加记录,每次添加时,将datetime型变量dt写入mysql数据库tablename表中exTime字段里。 问题,如何写入?调试时,总是无法写入。 运行环境:windows10python3.6mysql5.6.38 运行结果提示: Processfinishedwithexitcode0 #------看我写的程序------------- importdatetime importpymysql.cursors conn=pymysql.connect(host='127.0.0.1', &n
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN( plan=>'PLAN1', comment=>'TestPlan...', sub_plan=>FALSE);--默认值即为FALSE END; / BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( consumer_group=>'GROUP_OLTP', comment=>'GroupofOLTPUSERS...', mgmt_mth=>'ROUND-ROBIN');--该用户组内各会话的CPU资源采取轮询的分配方法 END; / BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( consumer_group=>'GROUP_OLAP', comment=>'GroupofOLAPUSERS...', mgmt_mth=>'ROUND-ROBIN'); END; / BEGIN DBMS_RESOURCE_MANAGER.
初始化 在本地需要关联到远程仓库的项目根目录下执行 gitinit 复制 然后关联远程仓库[project]。你需要存在一个远程仓库,名字随意,然后执行下面的命令(去掉中括号)就可以关联到该仓库。 gitremoteaddorigingit@gitee.com:idiv/[project].git 复制 提交 gitadd. gitcommit-m'初始化项目' gitpush-uoriginmaster 复制 一般在github或者gitee上新建项目会带有一个readme文件,也很有可能你本地gitinit的项目中也存在这样的文件,这样就会冲突,如果没有冲突到此就提交完成了。 解决冲突 如果远程仓库不为空就提交失败,解决方案rebase=fetch+merge 拉远程仓库文件 gitpull--rebaseoriginmaster 复制 有冲突解决冲突 可以在本地查看一下哪些地方冲突了,手动解决即可。 继续流程走 gitrebase--continue 复制 接着提交 gitpush-uoriginmaster 复制 ps:强制merge gitpulloriginmaster--
GPU主要是进行计算机图形这种大运算量的图形处理器,包括顶点设置、光影、像素操作。对CPU发出的数据和指令,进行着色,材质填充,渲染。 在没有GPU的系统中,3D游戏中物体移动时的坐标转换与光源处理,这些工作都是CPU配合特定软件进行的。 GPU的特点:1.类似于CPU,都是用来计算,而CPU一般擅长于串行处理。2.GPU的cache命中率不高,通过多线程技术来提高处理速度。3.GPU中无论是顶点数据还是像素数据都是互不相关的,因此可以并行独立的计算。4.顶点着色器流水线使用MIMD方式控制(比较有效率的执行分支程序)5.像素着色器流水线使用SIMD结构(运行条件语句造成很低的资源利用率,但优点是需要硬件少) 同CPU比较的优点,可以支持并行处理,超长流水线,SIMD,MIMD指令,浮点计算能力。 GPU一般包括:2Dengine,3Dengine,VideoProcessingEngine,FSAAEngine,显存管理单元。 GPU的图形(处理)流水线完成以下工作:1.顶点处理;根据图形的顶点数据确定3D图形的形状及位置关系,建立3D图形的骨架。由(VertexShader硬件),
几乎是计算机软件开发的发展历史 人月神话,增加人手并不一定能提高开发速度。原因在于,有些任务是无法分解的,存在先后顺序。无法同步进行。增加人手,增加的是沟通成本,相互牵制。可以分解的任务就可以通过增加人手来加快速度。但是不能分解的任务,增加人手只会增加开发时长。打个通俗比方,怀孕需要12个月,增加人手,也不能加快时间。作者赞赏的是,小型精干的技术团队是最好的。沟通成本低,开发效率高。厨师煎一个蛋,需要5分钟,而顾客期望2分钟。怎么都达不到,2分钟的办法是,把火开大可以快速点(类似于软件加班,多投入人),蛋会烧掉。 我们往往忽略了成员的沟通成本,培训成员的成本,拆解任务后,就变了,结果项目还是继续延长 已经延期的项目增加人手,会更加延期。分配任务,培训新成员的成本。这方面的坑,前人遇到过了。 评估技术开发任务的复杂度和时长,容易凭着直觉 困难的预估不足。这是我们的问题。 做项目,任务的评估时间忽视了软件开发的特点,我们往往凭着直觉来评估周期。增加人手不能解决问题。
这是一个很有意思的题目,题目大意比较简单,当给出的n个数两两互质时,输出“pairwisecoprime”,否则至少存在两个数不互质并且所有数的GCD=1,那么输出”setwisecoprime“,如果说这俩条件都不满足的话,那就输出“notcoprime”。 题解:这个问题可以转化为如何判断n个数两两互质,也就是说每两个数不存除1之外的公因数。我们注意到数据范围是1e6,暴力o(n^2)肯定是不行的。该怎么优化呢? 注意到“每两个数不存除1之外的公因数”,我们可以枚举公因数i,那么如果说一个数含有i这个因子,那么他一定是i的整数倍。然后我们用一个数组num保存每个数出现的次数,当枚举公因子i的时候,在加一个循环来枚举i的倍数x=i*k。(最大是x最大是1e6)。然后累加num[x],如果大于1的话,那就说明至少存在两个数,他们的公因子为i。 code: #include<bits/stdc++.h> usingnamespacestd; constintN=1e6+3; intnum[N]; intmain(){ intn,x; cin>>
第六章——敏捷流程 “敏捷流程”是一系列价值观和方法论的集合,敏捷的步骤:1.找出完成产品需要做的事情——ProductBacklog;2.决定当前的冲刺(Sprint)需要解决的事情——SprintBacklog;3.冲刺(Sprint);4.得到一个软件的增量版本,发布给用户。有敏捷流程,也要有敏捷的团队,敏捷对团队有以下要求:自主管理、自我组织、多功能型。这章对敏捷做了总结,也为我们分享了实践者应用敏捷流程的经验教训,同时,也通过故事的形式,为我们解答了很多疑问。 问题:初学者该如何应用敏捷流程?要注意什么? 第七章——MSF MSF是一套大型系统开发指南,是解决问题的基本架构,它描述了如何用组队模型、过程模型和应用模型来开发应用程序,是在微软的工具和技术的基础上建立并开发分布式企业系统应用的参考。MSF过程模型包含四个主要的里程碑,每个里程碑都是一个阶段的终结点,每次的里程碑回顾,都能使大家对最近的成果记忆犹新。MSF组队模型着重于解决在复杂软件工程项目中如何组建项目组、分配合适的角色、项目组的管理、职责划分和质量控制等问题。MSF有九条基本原则:(1)推
错误提示如下: 1WARNING!Using--passwordviatheCLIisinsecure.Use--password-stdin. 2Errorresponsefrom********:connect:connectionrefused复制 解决方法: 官方的配置地址:https://docs.docker.com/engine/reference/commandline/dockerd/#options 配置文件的默认路径:/etc/docker/daemon.json 1这是Linux上允许的配置选项的完整示例: 2 3{ 4"authorization-plugins":[], 5"data-root":"", 6"dns":[], 7"dns-opts":[], 8"dns-search":[], 9"exec-opts":[], 10"exec-root":"", 11"experimental":false, 12"storage-driver":"", 13"storage-opts":[], 14"labels":[], 15"live-re
Spring通过解析XML配置文件,利用反射技术对容器进行初始化。 环境配置: 导入dom4j包 <!--https://mvnrepository.com/artifact/dom4j/dom4j--> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> 复制 使用SAXReader读取xml文件 创建SAXReaderSAXReaderreader=newSAXReader(); 创建xml文件资源URLxmlUrl=XmlReaderTest.class.getClassLoader().getResource("applicationContext.xml"); 将SAXReader和XML文件资源关联Documentdoc=reader.read(xmlUrl); 访问XML节点和节点属性 获取根节点(一个
主要使用position的绝对定位absolute来做。 <!doctypehtml> <head> <style> body{ font-family:Helvetica,Arial,sans-serif; min-height:200vh; margin:0; } .container{ width:80%; max-width:1000px; margin:1emauto } .dropdown{ display:inline-block; position:relative; } .dropdown-label{ padding:0.5em1.5em; border:1pxsolid#ccc; background-color:#eee; } .dropdown-menu{ display:none; position:absolute; left:0; top:2.1em; min-width:100%; background-color:#eee; } .dropdown:hover.dropdown-menu{ display: