这是一个篇幅不长而且非常有用的教程,可以帮助你在终端启动一个Linux应用程序,而且使终端窗口不会遗失焦点。
我们有好多可以在Linux系统中打开一个终端窗口的方式,这取决于你的选择以及你的桌面环境。
若果是使用Ubuntu的话,你可以借助CTRL+ALT+T组合键打开终端。其实你也可以使用超级键(Windows键)打开Dash,搜索“TERM”,之后点击“Term”图标来打开终端窗口。
对于其他的桌面环境来说,比如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或则面板里面包含终端图标。
一般情况下linux下运行软件,你可以在终端上面直接输入应用程序名来启动一个应用程序。例如说,你可以通过输入“firefox”来启动Firefox。
在终端启动应用程序的用处是,你可以包含一些额外的参数。
比如,你可以通过下述命令来打开一个Firefox浏览窗口,之后借助默认的搜索引擎搜索相关信息:
firefox-search""
你可能会注意到,假如你启动Firefox,程序打开之后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。
一般情况下,假如你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关掉之后才能重新切换到终端控制。这是由于你在前台启动了这个程序。
假如要在Linux终端打开应用程序而且返回终端控制,这么你须要将应用程序启动为后台进程。
和下边所列的命令一样,我们可以通过降低一个(&)符号,将应用程序在后台启动。
libreoffice&
译者注:假如须要加参数的话,记得把&符号置于最后。
译者注:通常情况下,关掉终端时,在这个终端启动的后台程序也会被中止,要使终端关掉之后,后台程序仍然保持执行可以使用下述命令
nohupcommand[arg...]&
倘若应用程序目录没有安装在PATH变量包含的目录上面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。
/path/to/yourprogram&
假如你不确定程序输入那个Linux目录结构的话,可以使用find或则location命令来定位它。
可以输入下述符号来找到一个文件:
find/path/to/start/from-nameprogramname
比如,你可以输入下述命令来找到Firefox:
find/-namefirefox
命令运行的结果会嗖的一下输出一大堆,别害怕,你也可以通过less或则more来进行分页查看。
find/-namefirefox|more
find/-namefirefox|less
当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,
你可以通过sudo命令来提示权限。其实,假如你没有安装sudo的话,就只能切换到一个拥有权限的用户了。
sudofind/-namefirefox|more
假如你晓得你要查找的文件在你的当前目录结构中,这么你可以使用点来取代斜杠:
sudofind.-namefirefox|more
你可能须要sudo来提高权限,也可能根本就不须要,假如这个文件在你的主目录上面,这么就不须要使用sudo。
有些应用程序则必需要提高权限能够运行,否则你才会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或则使用sudo提高权限。
这儿有个小技巧。假如你运行了一个程序linux模拟,而且它须要提高权限来操作,输入下边命令试试:
sudo!!
Unix系统通过命令才能卸载安装的程序,但有用户在用makeuninstall命令卸载gdb调试工具时出现了问题,卸载失败,下边小编就教你们Unix怎么卸载gdb调试工具。
前几天安装最新的gdb过程中出了点问题,想卸载一下。结果执行“makeuninstall”命令后,出现下边的结果:
bash-3.2#makeuninstall
theuninstalltargetisnotsupportedinthistree
看上去,gdb不支持直接用“makeuninstall”命令卸载,这么怎么卸载它呢?
Yikes.
Aclumsyworkaroundistocdintoeachsubdirinthebuildtreeanddo
makeuninstallthere.
只能是步入每位子目录,分别执行“makeuninstall”命令了。
该问题主要是gdb调试工具卸载出现了bug,在没有修补的前提下需步入每位子目录执行命令卸载gdb调试工具。
代码弄成可执行文件,称作编译(compile);先编译这个,还是先编译那种(即编译的安排),称作建立(build)。
Make是最常用的建立工具,诞生于1977年,主要用于C语言的项目。并且实际上,任何只要某个文件有变化,就要重新建立的项目,都可以用Make建立。
一、Make的概念
Make这个词,英文的意思是"制做"。Make命令直接用了这个意思,就是要作出某个文件。例如,要作出文件a.txt,就可以执行下边的命令。
$makea.txt
然而,假若你真的输入这条命令,它并不会起作用。由于Make命令本身并不晓得,怎么作出a.txt,须要有人告诉它,怎么调用其他命令完成这个目标。
例如,假定文件a.txt依赖于b.txt和c.txt,是前面两个文件联接(cat命令)的产物。这么,make须要晓得下边的规则。
a.txt:b.txtc.txt
catb.txtc.txt>a.txt
也就是说,makea.txt这条命令的背后,实际上分成两步:第一步,确认b.txt和c.txt必须早已存在,第二步使用cat命令将这个两个文件合并,输出为新文件。
像这样的规则,都写在一个称作Makefile的文件中,Make命令依赖这个文件进行重构。Makefile文件也可以写为makefile,或则用命令行参数指定为其他文件名。
$make-frules.txt
#或则
$make--file=rules.txt
里面代码指定make命令根据rules.txt文件中的规则,进行建立。
其实,make只是一个按照指定的Shell命令进行重构的工具。它的规则很简单,你规定要建立那个文件、它依赖什么源文件,当这些文件有变动时,怎样重新建立它。
二、Makefile文件的格式
建立规则都写在Makefile文件上面,要学会怎样Make命令,就必须学会怎样编撰Makefile文件。
2.1概述
Makefile文件由一系列规则(rules)构成。每条规则的方式如下。
[tab]
里面第一行逗号后面的部份,称作"目标"(target),逗号旁边的部份称作"后置条件"(prerequisites);第二行必须由一个tab键起首,前面跟随"命令"(commands)。
"目标"是必需的,不可省略;"后置条件"和"命令"都是可选的,并且二者之中必须起码存在一个。
每条规则就明晰两件事:建立目标的后置条件是哪些,以及怎样建立。下边就详尽讲解,每条规则的这三个组成部份。
2.2目标(target)
一个目标(target)就构成一条规则。目标一般是文件名,指明Make命令所要建立的对象,例如上文的a.txt。目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。
不仅文件名,目标还可以是某个操作的名子,这称为"伪目标"(phonytarget)。
clean:
rm*.o
里面代码的目标是clean,它不是文件名,而是一个操作的名子,属于"伪目标",作用是删掉对象文件。
$makeclean
然而,假若当前目录中,恰好有一个文件称作clean,这么这个命令不会执行。由于Make发觉clean文件早已存在,就觉得没有必要重新建立了,就不会执行指定的rm命令。
为了防止这些情况,可以明晰申明clean是"伪目标",写法如下。
.PHONY:clean
clean:
rm*.otemp
申明clean是"伪目标"以后,make就不会去检测是否存在一个称作clean的文件,而是每次运行都执行对应的命令。像.PHONY这样的外置目标名还有不少,可以查看指南。
假如Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。
$make
里面代码执行Makefile文件的第一个目标。
2.3后置条件(prerequisites)
后置条件一般是一组文件名,之间用空格分隔。它指定了"目标"是否重新建立的判别标准:只要有一个后置文件不存在,或则有过更新(后置文件的last-modification时间戳比目标的时间戳新),"目标"就须要重新建立。
result.txt:source.txt
cpsource.txtresult.txt
里面代码中,建立result.txt的后置条件是source.txt。假如当前目录中,source.txt早已存在,这么makeresult.txt可以正常运行,否则必须再写一条规则,来世成source.txt。
source.txt:
echo"thisisthesource">source.txt
里面代码中,source.txt前面没有后置条件,就意味着它跟其他文件都无关,只要这个文件还不存在,每次调用makesource.txtlinux下运行软件,它就会生成。
$makeresult.txt
$makeresult.txt
里面命令连续执行两次makeresult.txt。第一次执行会先新建source.txt,之后再新建result.txt。第二次执行,Make发觉source.txt没有变动(时间戳晚于result.txt),就不会执行任何操作,result.txt也不会重新生成。
假如须要生成多个文件,常常采用下边的写法。
source:file1file2file3
里面代码中,source是一个伪目标,只有三个后置文件,没有任何对应的命令。
$makesource
执行makesource命令后,才会一次性生成file1,file2,file3三个文件。这比下边的写法要便捷好多。
$makefile1
$makefile2
$makefile3
2.4命令(commands)
命令(commands)表示怎么更新目标文件,由一行或多行的Shell命令组成。它是建立"目标"的具体指令,它的运行结果一般就是生成目标文件。
每行命令之前必须有一个tab键。假如想用其他键,可以用外置变量.RECIPEPREFIX申明。
.RECIPEPREFIX=>
all:
>echoHello,world
里面代码用.RECIPEPREFIX指定,小于号(>)取代tab键。所以,每一行命令的起首弄成了小于号,而不是tab键。
须要注意的是,每行命令在一个单独的shell中执行。这种Shell之间没有承继关系。
var-lost:
exportfoo=bar
echo"foo=[$$foo]"
里面代码执行后(makevar-lost),取不到foo的值。由于两行命令在两个不同的进程执行。一个解决办法是将两行命令写在一行,中间用分号分隔。
var-kept:
exportfoo=bar;echo"foo=[$$foo]"
另一个解决办法是在换行符前加反斜杠通配符。
var-kept:
exportfoo=bar;
echo"foo=[$$foo]"
最后一个方式是加上.ONESHELL:命令。
.ONESHELL:
var-kept:
exportfoo=bar;
echo"foo=[$$foo]"
三、Makefile文件的句型
3.1注释
井号(#)在Makefile中表示注释。
#这是注释
result.txt:source.txt
#这是注释
cpsource.txtresult.txt#这也是注释
3.2回声(echoing)
正常情况下,make会复印每条命令,之后再执行,这就称作回声(echoing)。
test:
#这是测试
执行前面的规则,会得到下边的结果。
$maketest
#这是测试
在命令的后面加上@,就可以关掉回声。
test:
@#这是测试
如今再执行maketest,就不会有任何输出。
因为在建立过程中,须要了解当前在执行哪条命令,所以一般只在注释和纯显示的echo命令后面加上@。
test:
@#这是测试
@echoTODO
3.3键值
转义(wildcard)拿来指定一组符合条件的文件名。Makefile的键值与Bash一致,主要有星号(*)、问号(?)和[...]。例如,*.o表示所有后缀名为o的文件。
clean:
rm-f*.o
3.4模式匹配
Make命令准许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。例如,假设当前目录下有f1.c和f2.c两个源码文件,须要将它们编译为对应的对象文件。
%.o:%.c
等同于下边的写法。
f1.o:f1.c
f2.o:f2.c
使用匹配符%,可以将大量同类型的文件,只用一条规则就完成建立。
3.5变量和形参符
Makefile准许使用等号自定义变量。
txt=HelloWorld
test:
@echo$(txt)
里面代码中,变量txt等于HelloWorld。调用时,变量须要置于$()之中。
调用Shell变量,须要在欧元符号前,再加一个卢布符号,这是由于Make命令会对欧元符号通配符。
test:
@echo$$HOME
有时,变量的值可能指向另一个变量。
v1=$(v2)
里面代码中,变量v1的值是另一个变量v2。这时会形成一个问题,v1的值究竟在定义时扩充(静态扩充),还是在运行时扩充(动态扩充)?假如v2的值是动态的,这两种扩充方法的结果可能会差别很大。
为了解决类似问题,Makefile一共提供了四个形参运算符(=、:=、?=、+=),它们的区别请看StackOverflow。
VARIABLE=value
#在执行时扩充,容许递归扩充。
VARIABLE:=value
#在定义时扩充。
VARIABLE?=value
#只有在该变量为空时才设置值。
VARIABLE+=value
#将值追加到变量的尾端。
3.6外置变量(ImplicitVariables)
Make命令提供一系列外置变量,例如,$(CC)指向当前使用的编译器,$(MAKE)指向当前使用的Make工具。这主要是为了跨平台的兼容性,详尽的外置变量清单见指南。
output:
$(CC)-ooutputinput.c
3.7手动变量(AutomaticVariables)
Make命令还提供一些手动变量,它们的值与当前规则有关。主要有以下几个。
(1)$@
$@指代当前目标,就是Make命令当前建立的那种目标。例如,makefoo的$@就指代foo。
a.txtb.txt:
touch$@
等同于下边的写法。
a.txt:
toucha.txt
b.txt:
touchb.txt
(2)$<
$<指代第一个后置条件。例如,规则为t:p1p2,这么$<就指代p1。
a.txt:b.txtc.txt
cp$<$@
等同于下边的写法。
a.txt:b.txtc.txt
cpb.txta.txt
(3)$?
$?指代比目标更新的所有后置条件,之间以空格分隔。例如,规则为t:p1p2,其中p2的时间戳比t新,$?就指代p2。
(4)$^
$^指代所有后置条件,之间以空格分隔。例如,规则为t:p1p2,这么$^就指代p1p2。
(5)$*
$*指代匹配符%匹配的部份,例如%匹配f1.txt中的f1,$*就表示f1。
(6)$(@D)和$(@F)
$(@D)和$(@F)分别指向$@的目录名和文件名。例如,$@是src/input.cpuppy linux,这么$(@D)的值为src,$(@F)的值为input.c。
(7)$(
$(
所有的手动变量清单,请看指南。下边是手动变量的一个反例。
dest/%.txt:src/%.txt
@[-ddest]||mkdirdest
cp$<$@
里面代码将src目录下的txt文件,拷贝到dest目录下。首先判定dest目录是否存在,倘若不存在就新建,之后,$<指代后置文件(src/%.txt),$@指代目标文件(dest/%.txt)。
3.8判定和循环
Makefile使用Bash句型,完成判别和循环。
ifeq($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
里面代码判定当前编译器是否gcc,之后指定不同的库文件。
LIST=onetwothree
all:
foriin$(LIST);do
echo$$i;
done
#等同于
all:
foriinonetwothree;do
echo$i;
done
里面代码的运行结果。
one
two
three
3.9函数
Makefile还可以使用函数,格式如下。
$(functionarguments)
#或则
${functionarguments}
Makefile提供了许多外置函数,可供调用。下边是几个常用的外置函数。
(1)shell函数
shell函数拿来执行shell命令
srcfiles:=$(shellechosrc/{00..99}.txt)
(2)wildcard函数
wildcard函数拿来在Makefile中,替换Bash的键值。
srcfiles:=$(wildcardsrc/*.txt)
(3)替换函数
替换函数的写法是:变量名+逗号+替换规则。
min:$(OUTPUT:.js=.min.js)
里面代码的意思是,将变量OUTPUT中的.js全部替换成.min.js。
四、Makefile的实例
(1)执行多个目标
.PHONY:cleanallcleanobjcleandiff
cleanall:cleanobjcleandiff
rmprogram
cleanobj:
rm*.o
cleandiff:
rm*.diff
里面代码可以调用不同目标,删掉不同后缀名的文件,也可以调用一个目标(cleanall),删掉所有指定类型的文件。
(2)编译C语言项目
edit:main.okbd.ocommand.odisplay.o
cc-oeditmain.okbd.ocommand.odisplay.o
main.o:main.cdefs.h
cc-cmain.c
kbd.o:kbd.cdefs.hcommand.h
cc-ckbd.c
command.o:command.cdefs.hcommand.h
cc-ccommand.c
display.o:display.cdefs.h
cc-cdisplay.c
clean:
rmeditmain.okbd.ocommand.odisplay.o
.PHONY:editclean