Bash

There are 3 entries for the tag Bash

Linux任务的高级管理:程序后台运行及控制

MitchellChu 2014-06-18 Unix & Linux

在Bash下操作,不可避免的需要让程序运行在后台而不妨碍前台的操作。在Linux有个概念称之为Job Control,由于Bash下的运行的任何程序都是当前Bash下的子程序,而job control也即管理当前Bash下的子程序。所以,Job Control的概念是不能跨Bash管理,比如我们不能在tty1中管理tty2中的程序。 其中我们在Bash中最常用的应该就是&符了,这个符号跟在要运行的程序的后面,像下面这样: ping blog.useasp.net & 这样配置后,我们将会发现,运行后,系统返回的是类似下面这样的: [1] 23911 这样我们就将这个ping放到了当前Bash的后台进行运行,我们此时仍可以正常的在Bash下进行其他的操作。但是你也许会发现这种方式运行的程序虽然不影响你当前操作,但是运行的输出却总是和我们抢占Bash的屏幕,非常的郁闷!但当我们想Ctrl+C来终止的时候,却又无能为力——因为在Bash下你Ctrl+C根本无法终止这个后台运行的程序! 为了防止这种情况,我们需要用到重定向(Redirection),如果你不太清楚,可以本博客之前的博文《Linux下高效编写Shell-Shell特殊字符汇总》篇里面的重定向,代码变化不大,类似下面这样: ## 重定向输出到/dev/null这个特殊文件 ## 也就是没有输出内容了 ping blog.useasp.net &>/dev/null & 当然,我们一般更希望后台运行的程序的输出能够保存到指定文件,而不是直接丢弃,所以更一般形式是: ping blog.useasp.net >>/tmp/background_programs.log 2>&1 & ## 想想这是什么意思? 但我们在这里是要Bash界面能够不被后台的程序搞砸。——毫无疑问,我们前一种已经达到了我们要的效果。  恩,迄今为止我们已经能够将程序放到后台运行了,但是,对于已经占据我们Bash的程序,我们却无能为力,为了不让它们继续霸占我们的Bash屏幕,我们迄今能做的只有Ctrl +C,让它见鬼去吧!这样我们跑了很久的程序也就终结了,不过,运行的数据可能也没有了。也许更温柔一点是个不错的选择——Ctrl+Z! Ctrl+Z是让程序暂停,在已经运行的程序上直接按下Ctrl+Z,他们就会非常自觉的将自己挂起,并放入到后台中,此时的程序是处于停止状态的,如果要让他在后台运行,就还要用到后面将学到的命令。但此时,我们的Bash屏幕能恢复干净清爽才最主要。  好了,在这难得平静的Bash界面上,让我们来学习下job control的一个命令吧,也许我们后台已经有一堆程序在跑呢,我们怎么也得看看才放心,jobs命令就是让我们干这个事情的: jobs [-lnprs] [jobspec ...] or jobs -x command [args] 参数: -l 列出后台程序的job number,PID, 状态和命令串 -n 显示自从上次用户知晓状态后程序改变过状态的程序 -r 仅列出正在后台运行(RUNNING)的程序 -s 仅列出后台中处于停止(STOPPED)的程序 更详细的内容可以参看man,这里基本够我们用了。 用用看,你也许会发现你的后台有很多程序在运行哦,同时你也会看到一些不同的地方,比如: jobs -l [1]- 10314 Running ping blog.useasp.net &>/dev/null & [2]+ 10833 Stopped emacs (wd:~) 中括号后面的竟然有+和-号,这是什么?这个是Bash根据我们放入后台的顺序的一个标记,+号表示最近被放到后台的程序,-号次之,如果有三个以上,我们就会发现第三个以上是没有+/-符号的。而下面我们将要看到的fg在取出后台程序的时候,+号在默认情况下就是那个被切换到前台的程序了。 既然上面我们说了fg,那就看看它是干什么的。fg应该是foreground的简写,即前台,它的作用是将在后台的程序切换到前台来运行。在切换的时候,fg可以指定参数——Job Number! ## 使用上面的jobs -l中的例子 fg ## 这个切换到前台运行的程序将会是emacs——Why? ## 或者我们使用下面这种形式 fg...

感叹号提高Bash下效率——历史扩展(bang命令)

MitchellChu 2014-06-03 Unix & Linux 编程语言

前一篇中介绍了在Bash下用快捷键来提高工作效率,而在Bash下要高效的工作,不仅仅可以从快捷键的方式来达到,Bash下还有很多其他方式,比如,使用别名,在之前的使用一些Shell下的特殊符号等,都能够一定程度的简化操作。而在Bash下还有另外一类——历史扩展,如果应用的当也能很大程度提高操作效率,嗯!Linux下你要放这么些代码,也显得很酷! 历史扩展(History Expansion)又被称为Bang(!)命令1,历史扩展是bash将历史命令转换到可执行命令的过程。Bash下的History库提供了一个与csh下历史扩展类似的历史扩展功能。历史扩展中操作历史命令一般有两个部分: 首先要从历史命令中找出相对应的命令,被选择到的命令我们称作为Event(条目),比如上面的Bang Bang(!!),就是选择最后一条命令; 选择选定行的部分或全部文本以包含到当前行中。要操作的条目(Event)Bash将其拆分成了Words(词),命令中的Words是靠空格来分割的,我们就可以使用修饰符(Modifiers)来调整Words以符合我们的要求。注意:Words并不是英文单词,而是一个字符序列而已。 例子: cat /tmp/cat.cat.txt ##这个是cat出cat.cat.txt的内容 !:0 !*:gs/cat./echo. ##获取命令,参数中的cat.换成echo. ##变成/tmp/echo.echo.txt内容. ## 第二个命令中: ##我们首先是选出命令!!(!:0可以写成!!:0,!*同样可以写成!!*) ##有了命令之后我们选择第二步 ##利用0,选择出词(!:0选择出来的是cat) ##第三步是对词进行操作,这里是!*后面对参数进行了字符替换。 ##最后变成完成的命令了: ## cat /tmp/echo.echo.txt 条目标志符(Event Designators)条目标志符是一个到历史列表内一个命令行实体的引用,除非是绝对引用,不然条目的引用是相对历史列表中当前位置的。 条目标志符 条目标志符说明 ! ...

Linux下更高效的使用Bash——快捷键

MitchellChu 2014-06-03 Unix & Linux 编程语言

在Linux下,Bash的地位无可忽视,日常中涉及到Linux下的管理与操作基本都是在Bash中进行,因此,为了提高Linux下工作效率,自然而然的就变成了如何高效使用Bash的问题。虽然上一篇Shell下的一些特殊字符在使用的时候,能够一定程度上提高效率,后一篇关于Bash下的历史扩展也能很大程度提高效率,但Bash上的一些快捷键才是提高效率的最简单也是最直接方式。本文正是奔着这个目标来的! 快捷键的一些说明: C = CTL = CTRL = CONTROL:这个键是指PC键盘上的Ctrl键 M = ALT:这个键是PC键盘上的ALT键,如果你键盘上没有这个键,可以尝试使用ESC键代替 S = SHIFT:此键是PC上的Shift键 E = ESC:这个键是PC键盘上的ESC键,此键一般在键盘的左上角 DEL = Backspace:此键是是PC键盘上的Backspace键,一般位于主键盘区的右上角 文中"[]"括住的为快捷键内容,"-"两边的内容是按住左边键,再按右边键获得,","逗号两边的内容是先按左边键,松开后再按右边键。如:[C-v]是表示按下Ctrl键之后,不要松开,再按下v键。 默认的情况下,快捷键的组成格式是:<Ctrl | Alt | Esc>-[Shift-]<char>。即由Ctrl,Alt,Esc之一开头,中划线,Shift,中划线,和一个字符组成。其中,中括号内的Shift和"-"有时可省略。 默认情况下,快捷键只有最后一个为字符,其他的键值均为功能键 出现[C-?]这类快捷键,由于"?"是需要使用SHIFT按键才能获得的字符,因此此类快捷键默认使用的是[C-S-?] 要注意,在Bash里面,快捷键可能会被写成八进制或者十六进制的形式(跟在转义符后面); 脚本文件中的快捷键并不是总能起作用的。另外快捷键有个规律,Ctrl开头的快捷键一般是针对字符的,而Alt开头的快捷键一般是针对词的。 Bash下,如果使用的是shell脚本文件,快捷键不一定是有的时候会出现同一个快捷键有不同的表现,这种情况一般是由于Bash所处的模式不同而引起的,你可以通过set命令来调整模式: set -o emacs ##切到emacs模式 ## set -o vi ##切到vi模式 ## set -o ## 查看当前选项的设置状态 这个是Bash的option选项,你可以根据具体情况进行设置,本文使用的是emacs模式。 快捷键 快捷键说明 ...

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。