1、system(執(zhí)行shell 命令)
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),青山企業(yè)網(wǎng)站建設(shè),青山品牌網(wǎng)站建設(shè),網(wǎng)站定制,青山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,青山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
相關(guān)函數(shù) fork,execve,waitpid,popen
表頭文件 #includestdlib.h
定義函數(shù) int system(const char * string);
函數(shù)說明 system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c
string來執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨
即返回原調(diào)用的進(jìn)程。在調(diào)用system()期間SIGCHLD 信號(hào)會(huì)被暫時(shí)
擱置,SIGINT和SIGQUIT 信號(hào)則會(huì)被忽略。
返回值 如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,其他失敗原因返回-
1。若參數(shù)string為空指針(NULL),則返回非零值。如果system()調(diào)
用成功則最后會(huì)返回執(zhí)行shell命令后的返回值,但是此返回值也有
可能為system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查
errno 來確認(rèn)執(zhí)行成功。
附加說明 在編寫具有SUID/SGID權(quán)限的程序時(shí)請(qǐng)勿使用system(),system()會(huì)
繼承環(huán)境變量,通過環(huán)境變量可能會(huì)造成系統(tǒng)安全的問題。
例如:
#includestdlib.h
main()
{
system(“l(fā)s -al /etc/passwd /etc/shadow”); //換成./test.sh 可執(zhí)行相關(guān)腳本
}
當(dāng)然也可以用管道或exec函數(shù)族來調(diào)用shell
linux下vim查找命令:
/text--查找text,按n查找下一個(gè),N查找上一個(gè)
?text--查找text(反向查找),按n查找下一個(gè),N查找上一個(gè)
*/#--查找光標(biāo)當(dāng)前的單詞,相當(dāng)于/text
:setignorecase--查找忽略大小寫
:setnoignorecase--查找不忽略大小寫
:nohlsearch--關(guān)閉當(dāng)前的高亮顯示,當(dāng)再次查找時(shí)恢復(fù)高亮
:setincsearch--逐步搜索模式,對(duì)當(dāng)前鍵入的字符進(jìn)行查找,不必等輸入完成
:setwrapscan--重新搜索,當(dāng)搜索到文件頭或尾時(shí),返回重新搜索
擴(kuò)展資料:
1、文件窗口:
:openfile--在當(dāng)前窗口打開新文件
:splitfile--在新窗口打開文件
:newfile--用新窗口打開文件,同:splitfile
:bn--切換到下一個(gè)文件
:bp--切換到上一個(gè)文件
:args--查看當(dāng)前打開的文件列表(當(dāng)前正在編輯的文件會(huì)用[]括起來)
:e
:e\qadriveest.txt--打開遠(yuǎn)程文件
:split--打開一個(gè)新窗口,光標(biāo)停在頂層的窗口上
:new--打開一個(gè)新窗口,光標(biāo)停在頂層的窗口上
:vsplit--橫向打開窗口。
Ctrl+ww--移動(dòng)到下一個(gè)窗口
Ctrl+wj--移動(dòng)到下方的窗口
Ctrl+wk--移動(dòng)到上方的窗口
2、其他命令:
Esc/Ctrl+[--鍵入命令
:!command--執(zhí)行shell命令
:suspend/Ctrl+Z--掛起vim,回到shell,fg返回vim
:!perl-cscript.pl--檢查perl腳本語法,不用退出vim
:!perlscript.pl--執(zhí)行perl腳本,不用退出vim
:help--顯示幫助文檔
:helpi--顯示i的幫助文檔(:特殊鍵用,-t:啟動(dòng)參數(shù)用-)
3、編輯命令:
插入:
i--在當(dāng)前位置插入
A--在當(dāng)前行尾插入
I--在當(dāng)前行首插入
o--在當(dāng)前行后插入一行
O--在當(dāng)前行前插入一行
拷貝粘貼剪切:
yy--拷貝當(dāng)前行
2yy--拷貝當(dāng)前行開始的2行
p--在當(dāng)前光標(biāo)后粘貼
P--在當(dāng)前行前粘貼
:1,10co20--將1-10行插入到第20行之后。
:1,$co$--將整個(gè)文件復(fù)制一份并添加到文件尾部
v--進(jìn)入選擇模式,相當(dāng)于在Windows下按住Shift選擇
V--進(jìn)入選擇模式,整行選擇
ddp--交換當(dāng)前行和其下一行
2dd--剪切當(dāng)前行之后的2行
:1,10d--將1-10行剪切
:1,10m20--將第1-10行移動(dòng)到第20行之后
替換:
ra--將當(dāng)前光標(biāo)所在字符替換為a
s/old/new/--用old替換new,替換當(dāng)前行的第一個(gè)匹配
s/old/new/g--用old替換new,替換當(dāng)前行的所有匹配
%s/old/new/--用old替換new,替換所有行的第一個(gè)匹配
%s/old/new/g--用old替換new,替換所有匹配
:10,20s/^/text/g--在第10行到第20行每行前面加上text(:3,5s/^/#/g--注釋3-5行,:3,5s/^#//g
--解除3-5行的注釋,:1,$s/^/#/g--注釋整個(gè)文檔,:%s/^/#/g--注釋整個(gè)文檔)
ddp--交換光標(biāo)所在行和下一行
移動(dòng):
h--左移一個(gè)字符(5h--左移5個(gè)字符)
l--右移一個(gè)字符(5l--右移5個(gè)字符)
k--上移一個(gè)字符(5k--上移5個(gè)字符)
j--下移一個(gè)字符(5j--下移5個(gè)字符)
w--向后移動(dòng)一個(gè)單詞(5w--向后移動(dòng)5個(gè)單詞)
b--向前移動(dòng)一個(gè)單詞(5b--向前移動(dòng)5個(gè)單詞)
e--同w,光標(biāo)停在單詞尾部
ge--同e,光標(biāo)停在單詞尾部
^--移動(dòng)到本行第一個(gè)非空白字符
0--移動(dòng)到本行第0個(gè)字符
--同0
$--移動(dòng)到行尾(3$--移動(dòng)到下面3行的行尾)
gg--移動(dòng)到文件頭(10gg--移動(dòng)到第10行首)
[[--同gg
G--移動(dòng)到文件尾(10G--移動(dòng)到第10行尾)
]]--同G
fx--移動(dòng)到本行光標(biāo)后第一個(gè)為x的字符(3fx--移動(dòng)到本行光標(biāo)后第3個(gè)為x的字符)
Fx--同fx,反向查找
:20--跳到20行行首
Ctrl+e--向下滾動(dòng)一行
Ctrl+y--向上滾動(dòng)一行
Ctrl+d--向下滾動(dòng)半屏
Ctrl+u--向上滾動(dòng)半屏
Ctrl+f--向下滾動(dòng)一屏
Ctrl+b--向上滾動(dòng)一屏
撤銷:
u--撤銷
U--撤銷對(duì)整行的操作
Ctrl+r--撤銷剛才的撤銷
刪除:
x--刪除當(dāng)前字符(3x--刪除當(dāng)前光標(biāo)開始向后三個(gè)字符)
X--刪除當(dāng)前字符的前一個(gè)字符,同dh
dl--刪除當(dāng)前字符,同x
dh--刪除前一個(gè)字符
dd--刪除當(dāng)前行
dj--刪除上一行
dk--刪除下一行
10d--刪除當(dāng)前行開始的10行。
D--刪除當(dāng)前字符至行尾,同d$
kdgg--刪除當(dāng)前行之前所有行(不包括當(dāng)前行)
:1,10d--刪除1-10行
:11,$d--刪除11行及以后所有的行
:1,$d--刪除所有行
J--刪除兩行之間的空行,合并兩行
退出
:wq--保存并退出
ZZ--保存并退出
:q!--強(qiáng)制退出并忽略所有更改
:e!--放棄所有修改,并打開原來文件
:close--關(guān)閉窗口,最后一個(gè)窗口不能使用此命令,可以防止意外退出vim
:q--如果是最后一個(gè)被關(guān)閉的窗口,那么將退出vim
以下是VI有關(guān)文件修改與保存的命令:
插入命令
i 在當(dāng)前位置生前插入
I 在當(dāng)前行首插入
a 在當(dāng)前位置后插入
A 在當(dāng)前行尾插入
o 在當(dāng)前行之后插入一行
O 在當(dāng)前行之前插入一行
查找命令
/text查找text,按n健查找下一個(gè),按N健查找前一個(gè)。
?text查找text,反向查找,按n健查找下一個(gè),按N健查找前一個(gè)。
vim中有一些特殊字符在查找時(shí)需要轉(zhuǎn)義.*[]^%/?~$
:set ignorecase忽略大小寫的查找
:set noignorecase不忽略大小寫的查找
查找很長的詞,如果一個(gè)詞很長,鍵入麻煩,可以將光標(biāo)移動(dòng)到該詞上,按*或#鍵即可以該單詞進(jìn)行搜索,相當(dāng)于/搜索。而#命令相當(dāng)于?搜索。
:set hlsearch高亮搜索結(jié)果,所有結(jié)果都高亮顯示,而不是只顯示一個(gè)匹配。
:set nohlsearch關(guān)閉高亮搜索顯示
:nohlsearch關(guān)閉當(dāng)前的高亮顯示,如果再次搜索或者按下n或N鍵,則會(huì)再次高亮。
:set incsearch逐步搜索模式,對(duì)當(dāng)前鍵入的字符進(jìn)行搜索而不必等待鍵入完成。
:set wrapscan重新搜索,在搜索到文件頭或尾時(shí),返回繼續(xù)搜索,默認(rèn)開啟。
替換命令
ra 將當(dāng)前字符替換為a,當(dāng)期字符即光標(biāo)所在字符。
s/old/new/ 用old替換new,替換當(dāng)前行的第一個(gè)匹配
s/old/new/g 用old替換new,替換當(dāng)前行的所有匹配
%s/old/new/ 用old替換new,替換所有行的第一個(gè)匹配
%s/old/new/g 用old替換new,替換整個(gè)文件的所有匹配
:10,20 s/^/ /g 在第10行知第20行每行前面加四個(gè)空格,用于縮進(jìn)。
ddp 交換光標(biāo)所在行和其下緊鄰的一行。
移動(dòng)命令
h 左移一個(gè)字符
l 右移一個(gè)字符,這個(gè)命令很少用,一般用w代替。
k 上移一個(gè)字符
j 下移一個(gè)字符
以上四個(gè)命令可以配合數(shù)字使用,比如20j就是向下移動(dòng)20行,5h就是向左移動(dòng)5個(gè)字符,在Vim中,很多命令都可以配合數(shù)字使用,比如刪除10個(gè)字符10x,在當(dāng)前位置后插入3個(gè)!,3a!Esc,這里的Esc是必須的,否則命令不生效。
w 向前移動(dòng)一個(gè)單詞(光標(biāo)停在單詞首部),如果已到行尾,則轉(zhuǎn)至下一行行首。此命令快,可以代替l命令。
b 向后移動(dòng)一個(gè)單詞 2b 向后移動(dòng)2個(gè)單詞
e,同w,只不過是光標(biāo)停在單詞尾部
ge,同b,光標(biāo)停在單詞尾部。
^ 移動(dòng)到本行第一個(gè)非空白字符上。
0(數(shù)字0)移動(dòng)到本行第一個(gè)字符上,
HOME 移動(dòng)到本行第一個(gè)字符。同0健。
$ 移動(dòng)到行尾 3$ 移動(dòng)到下面3行的行尾
gg 移動(dòng)到文件頭。 = [[
G(shift + g) 移動(dòng)到文件尾。 = ]]
f(find)命令也可以用于移動(dòng),fx將找到光標(biāo)后第一個(gè)為x的字符,3fd將找到第三個(gè)為d的字符。
F 同f,反向查找。
跳到指定行,冒號(hào)+行號(hào),回車,比如跳到240行就是 :240回車。另一個(gè)方法是行號(hào)+G,比如230G跳到230行。
Ctrl + e 向下滾動(dòng)一行
Ctrl + y 向上滾動(dòng)一行
Ctrl + d 向下滾動(dòng)半屏
Ctrl + u 向上滾動(dòng)半屏
Ctrl + f 向下滾動(dòng)一屏
Ctrl + b 向上滾動(dòng)一屏
撤銷和重做
u 撤銷(Undo)
U 撤銷對(duì)整行的操作
Ctrl + r 重做(Redo),即撤銷的撤銷。
刪除命令
x 刪除當(dāng)前字符
3x 刪除當(dāng)前光標(biāo)開始向后三個(gè)字符
X 刪除當(dāng)前字符的前一個(gè)字符。X=dh
dl 刪除當(dāng)前字符, dl=x
dh 刪除前一個(gè)字符
dd 刪除當(dāng)前行
dj 刪除上一行
dk 刪除下一行
10d 刪除當(dāng)前行開始的10行。
D 刪除當(dāng)前字符至行尾。D=d$
d$ 刪除當(dāng)前字符之后的所有字符(本行)
kdgg 刪除當(dāng)前行之前所有行(不包括當(dāng)前行)
jdG(jd shift + g) 刪除當(dāng)前行之后所有行(不包括當(dāng)前行)
:1,10d 刪除1-10行
:11,$d 刪除11行及以后所有的行
:1,$d 刪除所有行
J(shift + j)刪除兩行之間的空行,實(shí)際上是合并兩行。
拷貝和粘貼
yy 拷貝當(dāng)前行
nyy 拷貝當(dāng)前后開始的n行,比如2yy拷貝當(dāng)前行及其下一行。
p 在當(dāng)前光標(biāo)后粘貼,如果之前使用了yy命令來復(fù)制一行,那么就在當(dāng)前行的下一行粘貼。
shift+p 在當(dāng)前行前粘貼
:1,10 co 20 將1-10行插入到第20行之后。
:1,$ co $ 將整個(gè)文件復(fù)制一份并添加到文件尾部。
正常模式下按v(逐字)或V(逐行)進(jìn)入可視模式,然后用jklh命令移動(dòng)即可選擇某些行或字符,再按y即可復(fù)制
ddp交換當(dāng)前行和其下一行
xp交換當(dāng)前字符和其后一個(gè)字符
剪切命令
正常模式下按v(逐字)或V(逐行)進(jìn)入可視模式,然后用jklh命令移動(dòng)即可選擇某些行或字符,再按d即可剪切
ndd 剪切當(dāng)前行之后的n行。利用p命令可以對(duì)剪切的內(nèi)容進(jìn)行粘貼
:1,10d 將1-10行剪切。利用p命令可將剪切后的內(nèi)容進(jìn)行粘貼。
:1, 10 m 20 將第1-10行移動(dòng)到第20行之后。
退出命令
:wq 保存并退出
ZZ 保存并退出
:q! 強(qiáng)制退出并忽略所有更改
:e! 放棄所有修改,并打開原來文件。
$-記錄著當(dāng)前設(shè)置的shell選項(xiàng),himBH是默認(rèn)值,5個(gè)字母分別有各自含義。解釋如下:
h:hashall,打開這個(gè)選項(xiàng)后,Shell 會(huì)將命令所在的路徑記錄下來,避免每次都要查詢。舉例:當(dāng)h選項(xiàng)開啟時(shí),如果將某個(gè)自定義命令從/usr/bin/目錄下移動(dòng)到/usr/local/bin/,再運(yùn)行,會(huì)提示無此命令。而當(dāng)通過set +h將h選項(xiàng)關(guān)閉后,上述情況就不會(huì)出現(xiàn)。
i:interactive-comments,包含這個(gè)選項(xiàng)說明當(dāng)前的 shell 是一個(gè)交互式的 shell。所謂的交互式shell,就是輸入命令后,shell解釋執(zhí)行,然后返回一個(gè)結(jié)果。在腳本中,i選項(xiàng)是關(guān)閉的。
m:monitor,打開監(jiān)控模式,就可以通過Job control來控制進(jìn)程的停止、繼續(xù),后臺(tái)或者前臺(tái)執(zhí)行等。
B:braceexpand,大括號(hào)擴(kuò)展。舉例如下:
lenovo@lenovo-DK?~
$?ls
A_File
lenovo@lenovo-DK?~
$?cp?A_File{,.back_up}
lenovo@lenovo-DK?~
$?ls
A_File??A_File.back_up
如果關(guān)閉B選項(xiàng),那么shell就不會(huì)將大括號(hào)擴(kuò)展。
5.? H:history,Shell 會(huì)把我們執(zhí)行的命令記錄下來,可以通過 history 命令查看,每一行是序號(hào) + 執(zhí)行的命令,在 shell 退出時(shí),會(huì)將這些信息保存到~/.bash_history 文件中。如果H選項(xiàng)打開,就可以展開歷史列表中的命令,可以通過!感嘆號(hào)來完成,例如"!!"返回上最近的一個(gè)歷史命令,"!n"返回第 n 個(gè)歷史命令,等等。
【參考資料如下,但愿能幫到你^_^】