開篇: 問題和解決思路
在使用一些基礎IDE時,工具經常會在我們建立特定文件時給我們一個已經有了一些特定代碼的模板文件,但是在linux開發時,沒有這樣的IDE,怎么辦?雖然代碼量不是很多,但是能一次簡化它和IDE一樣也是一件讓人心情愉悅的事情
html文件中:
|
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=UTF-8"
>
<
title
>Insert title here</
title
>
</
head
>
<
body
>
</
body
>
</
html
>
|
php文件中:
|
1
2
3
4
5
|
<?php
filename:*****
author :*****
|
或者這樣:
shell文件中:
|
1
|
#!/bin/bash
|
Perl文件中:
|
1
|
#!/usr/bin/perl
|
Python文件中:
|
1
|
#!/usr/bin/python
|
每次都寫這么無聊的東西 實在是浪費時間,我也相信那就話:不懶的程序員不是一個好的程序員,
所以讓我們自己動手寫一個數據自己的命令,我們的思路還是那樣,利用linux啟動加載的機制:
利用login
login shell:取得 bash 時需要完整的登陸流程的,就稱為 login shell
/etc/profile -> ~/.bash_profile(~/.bash_login、~/.profile,bash 的 login shell 配置只會讀取上面三個文件的其中一個,順序從左到右)
/etc/profile文件:
~/.bash_profile文件: 
這里注意這幾個文件:
這是一個可以讓我們自由定制屬於自己的bash的配置文件(例如這里你可以 alias 設置屬於你自己的別名)、面向全系統的配置那就是 /etc/bashrc 了
那這個文件如何加載到bash環境中?
再來看看我們 ~/.bash_profile 中 寫了什么,所以你在 .bashrc 中定義的alias別名才會在系統開機時加載到環境中

這是一個當你退出shell環境是執行的一些操作的設置
這是記錄你執行過bash命令的一個歷史記錄文件
過程的錯誤
注意:這里我犯了一個嚴重的錯誤,我將我的new.sh文件放到 /etc/profile.d/ 目錄下,結果就是我無法登錄了!!!! 最后使用救援模式才把系統救了回來,看到這里大家一定要注意,++中間的是錯誤的
好了,我們分析一下為什么?
現象是:我已輸入用戶名/密碼 系統就立即exit到了登錄界面
當我在救援模式下刪除了/etc/profile.d下的new.sh文件時,我才意識到:/etc/profile文件中



這段代碼意思是:當登錄時會執行 /etc/profile.d/ 目錄下所有的 .sh文件,當系統執行我的new.sh文件時,我的new.sh文件要求 參數沒有的話就 exit退出了,哎,就是這么粗心的問題
那么正確的思路應該是:
echo $PATH

我選擇將文件放到 /usr/local/bin 目錄下
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
由於我們想讓我們寫的這些命令可以被系統中所有用戶使用,那我們就要對 /etc/profile 這個文件下手了!!!
看看 /etc/profile/ 中的內容就會明白,這個文件里面是一系列關於登錄用戶取得shell后的環境信息,我們可以將我們的這個執行命令放到這個文件中
但是最好還是別修改這個 文件,我們有更好的辦法;這個文件在最后有一個處理就是將 /etc/profile.d文件夾下的所有可執行的 *.sh 文件加入shell
環境中去,所以我們的思路就是把我們寫好的 shell 腳本放到這個目錄下去
讓我們看看 /etc/profile 這個文件中關於 profile.d中文件的加載

再來看看 /etc/profile.d/文件夾下文件

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
注意將我們寫好的 shell腳本所有用戶可讀和可執行權限
實現篇:
根據我們上面了解知識和思路,我們開始我們的實現步驟,詳細過程就不說了,太繁瑣了,我就簡單的在代碼中注釋了,本身沒有什么難道,有點基礎的相信都沒問題
設置命令格式:

代碼實現:
新建一個new.sh文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
#!/bin/bash
#+++++++++++++++++++++++++++++++++++
# filename: new.sh
# author: wangxb
# date: 2015-04-11 00:08:59
#+++++++++++++++++++++++++++++++++++
#------------------------------------------------------------------------------------------------------------------------------------------
# 由於在linux下開發時經常需要在新建文件后,輸入一下信息,類似於這樣:
# <?php
# filename:*****
# author :*****
# 或者這樣:
# shell文件中: #!/bin/bash
# Perl文件中: #!/usr/bin/perl
# Python文件中:#!/usr/bin/python
# 每次都寫這么無聊的東西 實在是浪費時間,我也相信那就話:不懶的程序員不是一個好的程序員,
# 所以讓我們自己動手寫一個數據自己的命令,我們的思路還是那樣,利用linux啟動加載的機制:
# 利用login
# login shell:取得 bash 時需要完整的登陸流程的,就稱為 login shell
# /etc/profile -> ~/.bash_profile(~/.bash_login、~/.profile,bash 的 login shell 配置只會讀取上面三個文件的其中一個,順序從左到右)
# 由於我們想讓我們寫的這些命令可以被系統中所有用戶使用,那我們就要對 /etc/profile 這個文件下手了!!!
# 看看 /etc/profile/ 中的內容就會明白,這個文件里面是一系列關於登錄用戶取得shell后的環境信息,我們可以將我們的這個執行命令放到這個文件中
# 但是最好還是別修改這個 文件,我們有更好的辦法;這個文件在最后有一個處理就是將 /etc/profile.d文件夾下的所有可執行的 *.sh 文件加入shell
# 環境中去,所以我們的思路就是把我們寫好的 shell 腳本放到這個目錄下去
# 注意將我們寫好的 shell腳本所有用戶可讀和可執行權限
# -----------------------------------------------------------------------------------------------------------------------------------------
# 設置模板文件存放路徑
TPL_DIR=
"/root/mylinux/myCommand/newtpl/tpl"
# 這里是根據命令的第一個參數來確定調用什么樣的模板文件和默認的生成文件的后綴名
case
$1
in
'html'
)
TPL_NAME=
"html.tpl"
suffix=
"html"
;;
'html5'
)
TPL_NAME=
"html5.tpl"
suffix=
"html"
;;
'php'
)
TPL_NAME=
"php.tpl"
suffix=
"php"
;;
'css'
)
TPL_NAME=
"css.tpl"
suffix=
"css"
;;
'js'
)
TPL_NAME=
"jss.tpl"
suffix=
"js"
;;
'py'
)
TPL_NAME=
"py.tpl"
suffix=
"py"
;;
'pl'
)
TPL_NAME=
"pl.tpl"
suffix=
"pl"
;;
'rb'
)
TPL_NAME=
"rb.tpl"
suffix=
"rb"
;;
'sh'
)
TPL_NAME=
"sh.tpl"
suffix=
"sh"
;;
*)
echo
"command type now exist"
exit
;;
esac
export
TPL_DIR
export
TPL_NAME
# 根據特定格式模板文件創建一個我們想要的文件的方法
function
createTpl() {
filename=
"$1.$2"
# 設置文件名
localdir=${3}
# 設置文件目錄
# 判斷在目標目錄下是否存在同名文件,對於[存在/不存在]進行相應處理
if
[ -f $localdir/$filename ];
then
create_date=$(
date
+
"%Y%m%d%H%M%S"
)
read
-p
"${filename} is exist, Do you want to ${1}_${create_date}.${suffix}.(y/n)"
yes_no
if
[
"$yes_no"
=
'y'
] || [
"$yes_no"
=
"Y"
] || [
"$yes_no"
=
"yes"
] || [
"$yes_no"
=
"YES"
];
then
filename=${1}_${create_date}.${suffix}
elif
[
"$yes_no"
=
'n'
] || [
"$yes_no"
=
"N"
] || [
"$yes_no"
=
"no"
] || [
"$yes_no"
=
"NO"
];
then
exit
fi
fi
# 判斷模板文件是否存在
# 存在:根據模板文件生成我們的文件,並自動替換其中的文件名、時間和創建者
if
[ -e ${TPL_DIR}/${TPL_NAME} ];
then
touch
$localdir/$filename >
/dev/null
2>&1
cat
$TPL_DIR/$TPL_NAME > $localdir/$filename 2>
/dev/null
cdate=$(
date
+
"%Y_%m_%d %H:%M:%S"
)
sed
-i
"s/@filename/$filename/g"
$localdir/$filename
sed
-i
"s/@cdate/$cdate/g"
$localdir/$filename
if
[ $
# -eq 4 ]; then
sed
-i
"s/@author/$4/g"
$localdir/$filename
else
who
=$(
whoami
)
sed
-i
"s/@author/$who/g"
$localdir/$filename
fi
vim $localdir/$filename
else
# 不存在:就創建一個空文件即可
touch
$localdir/$filename >
/dev/null
2>&1
vim $localdir/$filename
fi
}
# 檢查數據目錄是否是一個有效的目錄
function
checkDir() {
if
[
"$1"
=
""
];
then
localdir=$(
pwd
)
else
$(
cd
$1 >
/dev/null
2>&1) &&
cd
$1 >
/dev/null
2>&1 ||
exit
localdir=$(
pwd
)
fi
echo
$localdir
}
# 檢查輸入的文件后綴是否符合要求
function
checkSuffix() {
suffix=
''
if
[[
"$1"
=~ ^[a-zA-Z0-9]+$ ]];
then
suffix=$1
fi
echo
$suffix
}
# 左移我們的參數列表
shift
# 檢查必填參數文件名情況
if
[
"$#"
-lt 1 ] || [
"$1"
=
""
];
then
echo
"Command request file name(not allow empty) as first options"
exit
fi
# 對於數據的可選參數,根據輸入參數 進行不同處理
case
$
# in
1)
createTpl $1 $suffix $(
pwd
)
;;
2)
localdir=$(checkDir $2)
if
[ -z
"$localdir"
];
then
echo
'The directory does not exist'
exit
fi
createTpl $1 $suffix $localdir
;;
3)
localdir=$(checkDir $2)
if
[ -z
"$localdir"
];
then
echo
'The directory does not exist'
exit
fi
if
[ -z
"$(checkSuffix $3)"
];
then
echo
'suffix format is error'
exit
else
suffix=$(checkSuffix $3)
fi
createTpl $1 $suffix $localdir
;;
4)
localdir=$(checkDir $2)
if
[ -z
"$localdir"
];
then
echo
'The directory does not exist'
exit
fi
if
[ -z
"$(checkSuffix $3)"
];
then
echo
'suffix format is error'
exit
else
suffix=$(checkSuffix $3)
fi
if
[[
"$4"
=~ ^[a-zA-Z]+$ ]];
then
author=$4
else
author=$(
whoami
)
fi
createTpl $1 $suffix $localdir $author
;;
*)
echo
"options nums is error"
exit
;;
esac
|
建立tpl模板文件:
html.tpl:
|
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=UTF-8"
>
<
title
>Insert title here</
title
>
</
head
>
<
body
>
</
body
>
</
html
>
|
php.tpl
|
1
2
3
4
5
6
7
|
<?php
/*
* filename: @filename
* author : @author
* create : @cdate
* update : @update
*/
|
sh.tpl
|
1
2
3
4
5
6
7
8
|
#!/bin/bash
#+++++++++++++++++++++++++++++++++++++++++++++++++
# filename : @filename
# author : @author
# create : @cdate
# update : @update
#+++++++++++++++++++++++++++++++++++++++++++++++++
|
設置系統加載和alias 建立別名
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
根據我們開篇的知識我們復制我們的new.sh文件到 /etc/profile.d文件夾下:

設置執行權限

復制過來發現,我們文件的權限和其他文件一致,所以我們就不做修改了
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
復制復制我們的new.sh文件到 /usr/local/bin文件夾下,並更名為 new,修改權限可執行

測試:

OK 命令存在
復制我們的模板文件到 /var/tpl 目錄下
cp -r /root/mylinux/myCommand/newtpl/tpl /var/
修改new.sh文件中的TPL_DIR變量

alias設置別名 修改 /etc/bashrc 文件,在文件末尾追加

完工
激動的時候來了,我們試試執行我們的命令
新建html


新建php


看到么,初始化文件信息已經完成
新建 shell文件


再來看看,html和shell文件已經在當前目錄下生成,php文件則在我們的相對目錄下生成


結語
至此,一套屬於我們自己的命令就已經完成,萬事開頭難,昨天突然有了這個小想法,硬着頭皮開始做,現在弄完了覺得非常開心。嘿嘿 洗洗睡覺了
