提高效率小技巧:自定义终端命令或脚本文件

1,856 阅读7分钟

为什么会想到这个东西?

因为我在写代码时,经常遇到这种场景:

  1. 平时操作终端时,经常需要切换到桌面上,也就是经常手动输入:
cd ~/Desktop

输入的次数多了,就觉得烦了,虽然这个命令不长,但是还是想能不能输入一个 d 就直接实现切换到桌面目录呢?

  1. 做简单的小项目时,基本每次都会经历这样的步骤:

    创建一个 index.html 文件,在里面输入:

<!DOCTYPE html>
<html>
	<head>
    		<link rel='stylesheet' href='./style.css'>
            	...
    	</head>
	<body>
    		...
    		<script src='./main.js'></script>
    	</body>
</html>

然后创建对应的 css 文件和 js 文件;

这样的操作多了,就觉的很无聊,因为不仅操作步骤多,而且都是重复性的工作,能不能输入一个命令一件搞定呢?

基于上述场景,于是想到了使用自定义命令行指令和脚本;

alias

alias命令用于设置指令的别名,我们可以利用alias,来自定义指令的别名;

如果在终端里只输入 alias,就会列出目前所有别名的设置:

如何自定义一个指令呢?

步骤

1.首先进入用户目录:

cd ~

2.使用 VS Code 打开当前目录下的 .bashrc文件:

code .bashrc

当然这样写也可以:

code ./.bashrc

./ 就是代表当前目录的意思,这里不推荐输入因为 .bashrc 本身文件名就有点 . 所以加上当前目录的 ./ 容易眼花(别问我是怎么得出这个结论的,踩几次关于点的坑就明白了 -.-#)

3.在 VS Code 输入自定义指令的别名:

alias d="cd ~/Desktop"

或者熟悉 Linux 的也可以这样写:

echo 'alias d="cd ~/Desktop"' >> .bashrc

这里要注意: 给指令起的名字和指令之前的 等于号前后千万不要加空格!千万不要加空格!千万不要加空格!,就是 d="cd ~/Desktop" 里的这个等号两边不要加空格!

因为自己写 a = a + 1 这种方式写习惯了,不自觉的加了一个空格,于是花了很多时间来排查错误,最后发现是空格的原因。

4.输入完之后保存,使用 source 让命令生效:

保存了以后,在命令行里输入 d 还是提示没有这个命令:

d
bash: d: command not found

为啥?因为还没生效呢!要使用 source 命令让其生效:

source .bashrc

这样,你就可以使用自己自定义的指令来进行命令行操作了!

5.效果展示:

alias 的用途有很多,比如 windows 的 cmd,里面清屏的指令是 cls,而 bash 里的清屏指令是 clear,如果你习惯了用 cls,觉的 clear 不好用,就可以这样来替换:

alias cls="clear"

总之 alias 是个很好用的命令,具体用途可以自己根据不同的使用需求去思考。

自定义一个脚本文件

上面的 alias 适用于单句命令的设置,那么假如想之前说的第二个场景那样,有多个操作、多个命令怎么办呢?

这时我们就可以自定义一个脚本文件,来帮我们一次性执行多条命令。

步骤

1.创建一个文件

touch newpj

这里我是在 桌面这个文件夹 里创建了一个 newpj 文件,如果你操作的时候是在别的文件夹里请看好是哪个文件夹,防止后面搞错!另外这个文件是 没有后缀 的。

为什么叫 newpj?因为我是想创建一个文件夹,里面有 html、css 和 js文件的,所以 newpj就代表 new project 的缩写。自定义一个脚本名,爱叫啥就叫啥,这个无所谓。

2.用 VS Code 打开这个文件:

code newpj

然后输入:

mkdir 1
cd 1
touch index.html
touch style.css
touch main.js

3.给脚本文件添加可执行权限

chmod +x newpj

windows 不做这一步也没事,但是最好还是养成习惯;

4.使用脚本:

第一种方法:

./newpj

注意这里一定要加 ./,不然会报错!那我不想加 ./,有别的办法使用脚本吗?

第二种方法:

sh newpj

为什么这样就不用加 ./ 了呢?

因为 ./ 代表的是当前目录的意思,加上后命令行会直接找到当前目录下的这个文件去执行,如果不加,就找不到了。

而 sh 其实就是 bash 的缩写,你在前面添加上 sh 后,bash自动去寻找这个文件,找到后执行。

5.效果:

执行完后,桌面上果然就多了一个文件夹,并且里面有我们需要创建的文件:

问题和优化

自定义文件夹名称

上面仅仅是创建了一个简单的脚本,还有很多的问题。

比如,当我们第二次运行这个脚本的时候,就会报错:

报错提示说:没办法创建1文件夹,因为已经有一个了。

那我们不能每次项目文件夹都起名叫1吧?能不能有个办法,让我们输入一个参数,在创建的时候自定义文件名呢?

办法如下:

用 VS Code 打开我们的脚本文件,然后把文件夹1改成 $1

这时我们再去执行脚本:

./newpj

会提示我们参数缺失:

所以我们在执行的时候,要加上参数!

./newpj demo1
./newpj demo2
./newpj demo3

这样就能实现自定义创建的项目文件夹名称了:

创建时就初始化文件里的内容

运行脚本后,的确能生成我们需要的 html、css 和 js 文件,但是打开发现文件内容是空的,我想让文件在生成时就有初始化内容行不行?

可以!我们再次用 VS Code 打开 newpj 文件,添加一个 echo 语句:

mkdir $1
cd $1
touch index.html

echo '<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>标题</title>
		<link rel="stylesheet" href="./style.css">
	</head>
	<body>
		<script src="./main.js"></script>
	</body>
</html>' >> index.html

touch style.css
touch main.js

这里注意两个地方:

一是用 引号 把我们要填写的内容给包裹住,二是注意 **两个大于号 >> **不要输入成一个;

关于 echo命令的 > 和 >>

对 echo 命令不熟悉的可以看下,熟悉的直接略过看下面即可。

>    表示覆盖
>>   表示追加

假如我们有一个 1.txt 文件,里面的内容是 111:

下面我们来实验一下:

echo "222" > 1.txt

可以看到我们输入的内容,覆盖了原本的内容,所以一个大于号 > 代表覆盖的意思;

下面试试两个大于号 >>:

echo "333" >> 1.txt

我们输入的内容没有覆盖之前的内容,而是追加在后面了,所以两个大于号 >> 代表追加的意思;

提示:每次执行完 echo 命令后,我们打开 1.txt 文件查看,看完后请先 关闭文件,因为 Win 系统里你在打开文件的时候,外部就不好再操作这个文件了。所以如果你发现照着我的步骤执行了却没效果,那就是因为你看完没关闭文件,请先关闭文件后,再执行命令。

不加./ 和 sh 直接用命令

伟大的鲁迅先生说过:偷懒是人类进步的动力。

开个玩笑,但是人类在偷懒这件事的追求上的永无止境的。

于是我们会想,./ 和 sh 我都懒得输,能不能不输入也能执行我们的脚本文件呢?

可以的,这里需要我们把文件路径加到系统环境变量的 Path 里:

鼠标右击 桌面上的此电脑图标,选属性 ( 这里用Win10举例,Win7桌面上此电脑名字叫我的电脑 ),然后跟着图片操作:

  1. 在脚本文件开头加上一串字符:
#!/usr/bin/env sh

如图所示:

加好之后保存,然后就可以关闭脚本文件的编辑了。

  1. 高级系统设置:

  1. 环境变量

  1. 找到下面的系统变量,双击 Path:

  1. 新建,然后输入自己的脚本文件的所在目录

  2. 重启终端,直接输入我们的脚本文件名:

newpj demo4

搞定,这样就实现了:不加 ./,也不加sh,只输入脚本文件名称就能执行我们的脚本文件。

操作包括:创建了 demo4 目录,生成了 index.html 、style.css、main.js 文件,并且 index.html 文件在生成时自动有了初始化的内容。

关于 shebang 符号 !#

上面在脚本文件的开头部分,加上的内容:

#!/usr/bin/env sh

其实这是个 shebang 符号,看起来是一个注释内容,实际上是告诉系统,怎么执行这个文件。sh 就是 bash 的缩写,告诉系统,用 bash 来执行这个脚本文件。

即文件中存在 shebang 时,系统看到这个内容,会把这些内容当作解释器指令,然后去调用。