分享

Linux命令行下'!'的8大神奇的用法!

 豫龙晏子 2017-02-06

哈,终于收假回来了,各位亲是不是等不及了?这次的文章原创于别的大牛,这里在自己的环境来演示一下这八个神奇的用法,在Linux 系统中,'!' 符号或者操作符通常被用做逻辑否定的操作符,同时也通过一些调整和改动命令来从历史记录中找出你需要的命令行。

1.从history里使用命令号来运行命令

你或许从没意识到过可以从命令行历史记录(之前执行过的命令)里执行一条命令。它的方法是首先输入 'history' 命令得到命令的序号。 这时你可以通过命令 history 的输出中的命令序号来执行一条命令。这里为了方便看得比较清晰,我把历史记录的条数设置为5条,如下:

Linux命令行下

!history号

这里我使用!加上之前执行过的命令序号267就可以很快地执行这个cd的命令了!

2.执行指定的之前执行过的命令

和上一个功能其实是一样的,只不过这个是不用执行过的命令的序号,而是使用数字,从本次往后面数,比如我想执行上一次的命令,就执行!-1等等,如下:

Linux命令行下

!history数字

3.向一条新命令传递旧命令的参数避免重复输入

首先我使用了ls $GOPATH/src这个命令下面有什么东西,然后这时我又想更具体点,所以我使用 ls -al命令去查看,这时我们就不用再输入上面的命令了,直接使用!$代替掉就行了,如下:

Linux命令行下

!history替代变量

!$符号可以将上一条命令的参数传递给下一条命令参数

4.处理两个以上的参数

例如我在/home/yunzhongmuge目录创建了一个 1.txt 文件

# touch /yunzhongmuge/1.txt

然后使用CP命令把它复制到/home/yunzhongmuge/test目录

# cp /home/yunzhongmuge/1.txt /home/yunzhongmuge/test

这样我们就向CP命令传递了两个参数。

第一个是 /home/yunzhongmuge/1.txt

第二个是/home/yunzhongmuge/test

为了区分它们,我们 使用 echo 来打印每个参数。

# echo '1st Argument is: !^'

# echo '2st Argument is: !cp:2'

如下图:

Linux命令行下

!^

可以注意到第一个参数可以使用 '!^' 来表示,剩下的参数就可以使用 '命令名:参数序号'这种方式来表示,比如 '!cp:2'。

再举个例子,如果你执行的某个命令为 'xyz',命令 后面有5个参数而你想调用第四个参数,就可以使用 '!xyz:4' 来调用它。

当然,你可以使用 '!* ' 来表示所有参数。

5.使用关键词来执行之前的命令

可以通过执行关键词来执行之前的命令。可以按照下面的命令来理解:

# ls /home >/dev/null

# ls -l /home/yunzhongmuge/test >/dev/null

# ls -la /home/golang >/dev/null

# ls -lA /home/yunzhongmuge >/dev/null

上面是相同的ls命令对应了不同参数和文件夹。此外我们将每一个标准输出都传递到了 '/dev/null' 因为我们并不希望处理程序的标准输出。现在我们可以调用命令的关键词来实现它们。

# !ls

# !ls -l

# !ls -la

# !ls -lA

如下图:

Linux命令行下

!ls

6. 超级实用的!! 操作符

很多时候我们使用的都不是root这个用户的,所以在使用其他一般的用户是要安装一个东西或者其他的情况需要使用root权限的时候,这时我们使用这个命令就可以不用重新跳到root用户下执行然后再跳回来。比如我想在paas这个用户下面安装docker的时候,系统提示没有root权限,这时是使用!!这个操作符然后输入密码就可以安装了,非常方便,如下图:

Linux命令行下

!!

7.通过!(文件名) 的方式来避免命令对某个文件的影响。

我们有时候想把一个目录下面除了其中一个文件(或者同类型一类文件)其他的都想删除掉,这时候通过!来实现就变得非常简单了,如下图:

Linux命令行下

!()

这里需要注意的地方,当我们使用!()这个命令时,如果系统提示:bash: !: event not found这个错误这时可以依照下面的方法进行设置即可。

# shopt -u extglob; set +H

# shopt -s extglob; set +H

如下图:

Linux命令行下

!event not found

8.检查某个目录是否存在

这个功能在shell脚本用得非常多,大概有三种情况,一种是判断这个目录是否存在,并将结果打印出来;第二种判断目录是否存在,不存在就直接退出脚本。第三种就是判断目录是否存在,不存在就新建。其他情景可以根据自己的实际情况来改造。这里作为演示就判断一下目录是否存在,并打印一下是否存在。如下图:

Linux命令行下

! -d

好了,该分享到此结束,good luck!


May you share freely, never taking more than you give.

亲,关注、评论、收藏、转发一下呗!谢谢!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多