启动命令如何不输入./

启动命令如何不输入./

执行当前文件夹下的可执行程序,不加”./”的方法:

直接执行当前目录下的程序可以使用一下方法:

1. export PATH=$PATH:. 语句(冒号后加一个点)写到用户主目录的.bashrc中;

2. 将可执行程序拷贝至/usr/bin或者/usr/local/bin (如果程序需要经常修改,还是采用第一种方法较好)

执行当前可执行程序加”./”的原因:

主要是安全原因,因为在linux中执行程序时,会先搜索当前目录然后是系统目录,所以如果当前目录中有与系统可执行程序重名的程序,比如cp,她就会优先执行当前目录中的cp,但是如果当前目录的cp是木马,就会威胁到系统安全,所以这是Linux的一种安全策略,所以默认并没有把当前目录加到环境变量PATH中去。

脚本控制

脚本控制

13.1 处理信号

13.1.1 Linux信号回顾

       可以使用kill –l查看linux的信号集。

13.1.2 生成信号

       平时我们使用的CTRL+C就为发送了SIGINT信号;而CTRL+Z为生成了SIGTSTP信号,停止进程而不终止进程,停止进城后程序仍然爱留在内存中,能够从停止的地方继续运行。

13.1.3 捕获信号

       可以使用trap commands signals来捕获信号并拦截,如果脚本收到在trap命令中列出的信号,它将保护该信号不被shell处理。

       例如

       trap “echo haha” SIGINT SIGTERM,在该shell遇到两个信号时只是打印出haha而不会终止程序。

13.1.4 捕获脚本退出

       与上述相同,比如trap “echo haha” EXIT就会捕获退出信号,就算是CTRL+C也会捕获该信号。

13.1.5 移除捕获

       可以使用trap – signal来溢出捕获,但是如果在移除捕获之前收到了信号,脚本仍将根据trap命令处理该信号。

13.2 以后台模式运行脚本

13.2.1 以后台模式运行

       命令后添加&即可后台运行。

13.2.3 退出终端

       需要注意的是,运行后台进程的终端如果关闭的话,所有的后台进程也将退出。

13.3 在不使用控制台的情况下运行脚本

$nohup ./testshell &

nohup命令运行另一个命令阻塞发送到进程的任何SIGHUP信号,这可以防止在退出终端会话时退出进程。

13.4 作业控制

       重启、停止、终止和恢复作业的操作称为作业控制job control

13.4.1 查看作业

       命令jobs输出的信息中带有加号+的作业被视为默认作业,带有减号的作业是在处理完当前默认作业之后将称为默认作业的作业。在某一个时间点,无论shell中运行了多少作业,只能有一个带有加号+的作业,也只能有一个带有减号的作业。

13.4.2 重新启动停止的作业

       以后台模式启动bg n,以前台模式启动fg n,其中n为作业的编号。

13.5 变得更好

       默认情况下,从shell启动的所有进程在linux系统上的调度优先级scheduling priority都相同,为0。调度优先级的范围为从-20(最高优先级)到20(最低优先级)。

13.5.1 nice命令

       nice命令可以在启动命令时设置它的调度优先级。不过只能让命令在更低的优先级下运行,而不能调高优先级。这是一个安全特性,防止用户以高优先级启动所有命令。

       格式为 : nice –n N command

13.5.2 renice命令

       格式为renice N –p PID ,其中N为想调至的优先级参数。

       命令renice可以指定运行进程的PID以更改优先级。与nice命令一样,renice命令也有几个限制:

 

l  只能对拥有的进程使用renice命令;

l  只能使用renice命令将进程调制更低的优先级;

l  跟用户可以使用renice命令敬爱那个任何进程调至任何优先级。

13.6 准确无误地运行

13.6.1 使用at命令调度作业

       at命令运行指定linux系统运行脚本的时间。at命令将作业提交到一个队列,并指示shell在何时运行该作业。另一个命令atd以后台模式运行,并检查作业队列以运行作业。

       atd命令检查系统上的特殊目录,通常是/var/spool/at,以便运行使用at命令提交的作业。

       at命令的格式很简单:

       at [-f filename] time :其中filename为希望执行的脚本文件,time为希望运行的时间。其中time的方式可以发挥你的创造性了。

       使用at命令时,作业将提交到作业队列job queue中,有26中不同的作业队列可用于不同的优先级水平。使用小写字母az引用作业队列。

       默认情况下,所有的at作业都提交到作业队列a,即最高的优先级队列。如果希望以较低的优先级运行作业,可以使用-q参数指定字母。

       默认情况下,at作业完成后,不会再显示器显示任何内容,但是系统将生成一个电子邮件信息。

       使用atq命令可以查看系统中排队的作业。

       可以使用atrm N命令移除排队的作业,其中N为作业编号。

13.6.2 使用batch命令

       命令batchat稍有不同,batch命令的作用不是安排脚本在预设的时间运行,而是安排脚本在系统使用率低时运行

       如果linux系统正处于高负载水平,batch命令将延迟提交作业的运行,直到系统负载减低为止。这对于服务器是个良好的特性,因为服务器在白天和夜晚的负载水平可能大不相同。batch会检查linux系统当前的平均负载水平,如果平均负载低于0.8,它将运行在作业队列中的作业。

       batch命令的格式与at类似:

       batch [-f filename] [time]

13.6.3 调度定期脚本

       Linux系统中的cron程序可以调度需要定期运行的饿作业,cron程序在后台运行,它从特殊表格(cron表格)中查找需要调度运行的作业。

       cron表格的格式如下:

min hour dayofmonth month dayofweek command

       可以使用crontab –l查看现有的cron表格。

       对于cron存在的问题是,如果系统处于关闭状态,作业将无法执行。而anacron程序使用时间戳确定调度的作业是够在正确的时间间隔运行,如果确实错过了该作业的调度运行时间,它将尽快自动运行改作业。这意味着,如果Linux系统关闭了好几天,当它再次开启时,任何计划在系统关闭器件运行的作业都将自动运行。

       anacron表格的格式稍微不同于cron表格的格式:

period delay identifier command

13.7 从头开始

13.7.1 在启动时启动脚本

       可以写入rc脚本中,随系统一起启动。

13.7.2 随新shell一起启动

       写入.bashrc或者.bash_profile中,随着打开shell时启动。

using linux enviroment variables

使用Linux环境变量

5.1 什么是环境变量

bash shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息(环境变量的名称由此而来)。该特性还允许你将数据存储在内存中,以便于在shell中运行的程序和脚本访问它们。这是一种便捷的、用于存储持久性数据的方式,这些数据可以标示用户账户、系统、shell或任何需要存储的内容的特性。

bash shell中共有两种类型的环境变量:

l  全局变量;

l  本地变量;

5.1.1 全局环境变量

要查看全局变量,可以使用printenv命令。

通过该命令的输出,我们可以看到bash shell已经设置了许多全局环境变量,其中大多数由系统在登录过程中设置。

5.1.2 本地环境变量

       本地环境变量只在定义它们的本地进程中可见。可以通过set命令显示特定进程的所有环境变量集。这其中包含了全局环境变量和本地环境变量。

5.2 设置环境变量

5.2.1 设置本地环境变量

       为环境变量分配一个数值或者字符串,方法是使用等号将变量指定为具体值。

例如

$ test=hello

那么我们使用

$ echo $test

就可以输出hello

当然如果赋值为一个字符串,需要用单引号括起来,否则空格后的字符会被认为是命令而出错。

       如果创建新环境变量,建议(但不要求)使用小写字母。这用助于区分个人环境变量与系统环境变量。

5.2.2 设置全局环境变量

       创建全局变量的方法是创建一个本地环境变量,然后使用export将它导出到全局环境中。

5.3 移除环境变量

       可以使用unset命令来移除环境变量,在unset命令中引用环境变量时,不要使用美元符号。

5.4 默认的shell环境变量

1BASH :记录当前bash shell的路径。

举例:[root@localhost awK]# echo $BASH

/bin/bash

2BASH_SUBSHELL  :记录当前子shell的层次。BASH_SUBSHELL是从0开始计数的整数。

3BASH_VERSINFO  :是一个数组包含六个元素,这六个元素显示bash的版本信息。

4BASH_VERSION  :显示shell版本的信息。

5DIRSTACK  :记录了栈顶的目录值,初值为空。

6GLOBLGNORE :是由冒号分割的模式列表,表示通配时忽略的文件名集合。

7GROUPS   :记录当前用户所属的组。

8HOME :记录当前用户的家目录,由/etc/passwd的倒数第二个域决定。

9HOSTNAME  :记录主机名。

10HOSTTYPEMACHTYPE :都是记录系统的硬件架构。

11IFS  :用于设置指定shell域分隔符,默认情况下为空格。

[root@localhost awK]# export IFS=:

[root@localhost awK]# echo $PATH

/usr/local/sbin /usr/local/bin /sbin /bin/usr/sbin /usr/bin /root/bin

12OLDPWD   :记录旧的工作目录。

13 OSTYPE  :记录操作系统类型。

14 PATH  :环境变量,显示当前PATH环境变量的内容。

15PPID :是创建当前进程的进程号,即当前进程的父进程号

16PS1  :提示符变量,用于设置提示符格式,用于设置一级shell提示符环境变量。

17PS2  :用于设置二级shell提示符环境变量。

18PWD :记录当前路径

19REPLY  REPLY变量与readselect有关。

20SECONDS:记录脚本从开始到结束耗费的时间。

21SHELL :显示当前所用的shell

22SHELLOPTS  :记录了处于状态的shell选项列表,它只是一个只读变量。

23 SHLVL   :记录了bash嵌套的层次,一般来说,我们启动第一个Shell时。  $SHLVL=1。如果在这个Shell中执行脚本,脚本中的$SHLVL=2

24TMOUT  :用来设置脚本过期的时间,比如TMOUT=3,表示该脚本3秒后过期。

25UID : 已登用户的ID

26USER :显示当前用户名字

 

       注意:使用set命令时,并非所有的默认环境变量都会显示出来,因为有些默认的环境变量时不需要赋值的。

5.5 设置PATH环境变量

       增加环境变量的方法为export PATH=$PTAH:/the/path/you/want/to/add

       有时我们可以使用PATH=$PATH:. 临时让当前目录添加到PATH变量中,可以执行当前目录的程序而不用添加./ ,不错哟。

5.6 定位系统环境变量

       Bash shell将查找下面的文件用来处理登录shell的设置:

l  /etc/profile

n  是系统上的主默认启动文件,系统上的每一个用户在登录时都将执行此启动文件,比如安装了什么软件,需要每个人都使用,那么需要将环境变量设置在该文件。

l  $HOME/.bash_profile

l  $HOME/.bash_login

l  $HOME/.profile

n  上面的3个启动文件主要特定于各个用户,这应该叫井水不犯河水。

l  $HOME/.bashrc

n  该文件为交互式shell启动时处理的。

5.7 变量数组

       可以使用

$ mytest=(one two three four five)

为某个环境变量设置多个值,但是在显示的时候,如果使用

$echo $mytest

那么只会出现one,而是用$echo ${mytest[1]},则显示two,可以使用

$echo ${mytest[*]}显示所有的值。

5.8 使用命令别名

       命名别名允许您为公共命令以及它们的参数创建别名,以尽可能减少录入工作。

比如我的alias为:

       因为我们知道,在启动新的交互式的shell时,bash shell始终会读取.bashrc启动文件,所以我们可以把别名放在该文件中。

vim出错warning setlocale LC_CTYPE cannot change locale

vim出错warning setlocale LC_CTYPE cannot change locale

在终端命令行下面,为了放置出现乱码,将LANG设置为en,不过在vim的时候却出现了如下提示信息:

warning: setlocale: LC_CTYPE: cannot change locale (en)

估计就是语系的问题吧。

 

解决方法:

bashrc中将设置的LANG的语句注释就正常了。

 

疑问

PS1默认提示符

可以通过修改Linux下的默认提示符,使其更加实用。

默认的PS1的值是“\s-\v\$”,显示出了shell的名称的版本。我们通过修改,可以使其显示用户名、主机名和当前工作目录。  export PS1=”\u@\h \w>”

PS1使用的一些代码如下:

l  \u — 用户名

l  \h — 主机名

l  \w — 当前目录的完整路径。

请注意当你在主目录下的时候,如上面所示只会显示~ 注意,在PS1值之后有一个空格。从个人角度来讲,使用这个空格可以增加一定的可读性。

export PS1=”\u@\h \w>” 添加到.bash_profile 或者 .bashrc中,则可以保证其永久有效。