@echo off是什么意思_为什么执行自己的程序要在前面加./
前言
在Linux中,我們執(zhí)行內(nèi)置命令時(shí),直接輸入命令名稱(chēng)即可,如:
$?mv?a?b?#將a重命名為b而在執(zhí)行自己寫(xiě)好的程序時(shí),卻要帶上./,例如:
$?hellohello:?command?not?found
$?./hello
hello?world
這是為什么呢?它們有什么區(qū)別呢?
shell是如何運(yùn)行程序的
在說(shuō)明清楚問(wèn)題之前,我們必須了解shell是如何運(yùn)行程序的。首先我們必須要清楚的是,執(zhí)行一條Linux命令,本質(zhì)是在運(yùn)行一個(gè)程序,如執(zhí)行l(wèi)s命令,它執(zhí)行的是ls程序。那么在shell中輸入一條命令,到底發(fā)生了什么?如果沒(méi)有給出當(dāng)前路徑或絕對(duì)路徑,它會(huì)經(jīng)歷哪幾個(gè)查找過(guò)程?
alias中查找
alias命令可用來(lái)設(shè)置命令別名,而單獨(dú)輸入alias可以查看到已設(shè)置的別名:
$?aliasalias?egrep='egrep?--color=auto'
alias?fgrep='fgrep?--color=auto'
alias?grep='grep?--color=auto'
alias?l='ls?-CF'
alias?la='ls?-A'
alias?ll='ls?-alF'
alias?ls='ls?--color=auto'
如果這里沒(méi)有找到你執(zhí)行的命令,那么就會(huì)接下去查找。如果找到了,那么就會(huì)執(zhí)行下去。
內(nèi)置命令中查找
不同的shell包含一些不同的內(nèi)置命令,通常不需要shell到磁盤(pán)中去搜索。通過(guò)help命令可以看到有哪些內(nèi)置命令:
$?help通過(guò)type 命令可以查看命令類(lèi)型:
$?type?echoecho?is?a?shell?builtin
如果是內(nèi)置命令,則會(huì)直接執(zhí)行,否則繼續(xù)查找。
PATH中查找
以ls為例,在shell輸入ls時(shí),首先它會(huì)從PATH環(huán)境變量中查找,PATH內(nèi)容是什么呢,我們看看:
$?echo?$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
所以它會(huì)在這些路徑下去尋找ls程序,按照路徑找到的第一個(gè)ls程序就會(huì)被執(zhí)行。使用whereis也能確定ls的位置:
$?whereis?lsls:?/bin/ls?/usr/share/man/man1/ls.1.g
既然它是在bin目錄下,那么我把ls從bin目錄下移走是不是就找不到了呢?是的。
$?mv?/bin/ls?/temp/ls_bak??#測(cè)試完后記得改回來(lái)奧現(xiàn)在再來(lái)執(zhí)行l(wèi)s命令看看:
$?ls?The?program?'ls'?is?currently?not?installed.?You?can?install?it?by?typing:
apt?install?coreutils
沒(méi)錯(cuò),它會(huì)提示你沒(méi)有安裝這個(gè)程序或者命令沒(méi)有找到。
所以你現(xiàn)在明白為什么你第一次安裝jdk或者python的時(shí)候要設(shè)置環(huán)境變量了吧?不設(shè)置的話行不行?
行。這個(gè)時(shí)候你就需要指定路徑了。怎么指定路徑?無(wú)非就是那么幾種,相對(duì)路徑,絕對(duì)路徑等等。比如:
$?cd?/temp$?./ls_bak
或者:
$?/temp/ls_bak是不是發(fā)現(xiàn)和運(yùn)行自己的普通程序方式?jīng)]什么差別呢?
到這里,如果還沒(méi)有找到你要執(zhí)行的命令,那么就會(huì)報(bào)錯(cuò)。
確定解釋程序
在找到程序之后呢,需要確定解釋程序。什么意思呢?shell通常可以執(zhí)行兩種程序,一種是二進(jìn)制程序,一種是腳本程序。
而一旦發(fā)現(xiàn)要執(zhí)行的程序文件是文本文件,且文本未指定解釋程序,那么就會(huì)默認(rèn)當(dāng)成shell腳本來(lái)執(zhí)行。例如,假設(shè)有test.txt內(nèi)容如下:
echo?-e?"hello?world"賦予執(zhí)行權(quán)限并執(zhí)行:
$?chmod?+x?test.txt$?./test.txt
hello?world
當(dāng)然了,我們通常會(huì)在shell腳本程序的來(lái)頭帶上下面這句:
#!/bin/bash這是告訴shell,你要用bash程序來(lái)解釋執(zhí)行test.txt。作為一位調(diào)皮的開(kāi)發(fā)者,如果開(kāi)頭改成下面這樣呢?
#!/usr/bin/python再次執(zhí)行之后結(jié)果如下:
$?./test.txt??File?"./test.txt",?line?2
????echo?-e?"hello?world"
????????????????????????^
SyntaxError:?invalid?syntax
是的,它被當(dāng)成python腳本來(lái)執(zhí)行了,自然就會(huì)報(bào)錯(cuò)了。
那么如果是二進(jìn)制程序呢?就會(huì)使用execl族函數(shù)去創(chuàng)建一個(gè)新的進(jìn)程來(lái)運(yùn)行新的程序了。
小結(jié)一下前面的內(nèi)容,就是說(shuō),如果是文本程序,且開(kāi)頭沒(méi)有指定解釋程序,則按照shell腳本處理,如果指定了解釋程序,則使用解釋程序來(lái)解釋運(yùn)行;對(duì)于二進(jìn)制程序,則直接創(chuàng)建新的進(jìn)程即可。
運(yùn)行
前面我們也已經(jīng)看到了運(yùn)行方式,設(shè)置環(huán)境變量或者使用相對(duì)路徑,絕對(duì)路徑即可。不過(guò)對(duì)于shell腳本,你還可以像下面這樣執(zhí)行:
$?sh?test.txt$?.?test.txt??
即便test.txt沒(méi)有執(zhí)行權(quán)限,也能夠正常執(zhí)行。
什么?你說(shuō)為什么txt也能執(zhí)行?注意,Linux下的文件后綴不過(guò)是為了方便識(shí)別文件類(lèi)型罷了,以.txt結(jié)尾,并不代表一定是文本。當(dāng)然在這里它確實(shí)是,而且還是ASCII text executable:
$?file?test.txttest.txt:?Bourne-Again?shell?script,?ASCII?text?executable
$?file?hello
hello:?ELF?64-bit?LSB?executable,?x86-64,?version?1?(SYSV),?dynamically?linked,?interpreter?/lib64/l,?for?GNU/Linux?2.6.32,?BuildID[sha1]=8ae48f0f84912dec98511581c876aa042824efdb,?not?stripped
擴(kuò)展一下
那么如果讓我們自己的程序也能夠像Linux內(nèi)置命令一樣輸入即可被識(shí)別呢?
將程序放到PATH路徑下
第一種方法就是將我們自己的程序放到PATH中的路徑中去,這樣在shell輸入hello時(shí),也能找到,例如我們將其放在/bin目錄下:
$?hellohello?world
$?whereis?hello
hello:?/bin/hello
也就是說(shuō),如果你的程序安裝在了PATH指定的路徑,就需要配置PATH環(huán)境變量,在命令行輸入就可以直接找到了。
設(shè)置PATH環(huán)境變量
那么如果想在指定的目錄能夠直接運(yùn)行呢?很簡(jiǎn)單,那就是添加環(huán)境變量,例如將當(dāng)前路徑加入到PATH中:
$?PATH=$PATH:./???#這種方式只在當(dāng)前shell有效,所有shell生效可修改/etc/profile文件$?hello
hello?world
設(shè)置別名
例如:
$?alias?hello="/temp/hello"$?hello
hello?world
以上三種方法都可以達(dá)到目的。
執(zhí)行順序
那么假設(shè)我寫(xiě)了一個(gè)自己的printf程序,當(dāng)執(zhí)行printf的時(shí)候,到底執(zhí)行的是哪一個(gè)呢?
實(shí)際上它的查找順序可以可以通過(guò)type -a來(lái)查看:
$?type?-a?printfprintf?is?aliased?to?`printf?"hello
"'
printf?is?a?shell?builtin
printf?is?/usr/bin/printf
printf?is?./printf
這里就可以很清楚地看到查找順序了。也就是說(shuō),如果你輸入printf,它執(zhí)行的是:
$?printfhello
而如果刪除別名:
unalias?printf它執(zhí)行的將會(huì)是內(nèi)置命令printf。以此類(lèi)推。
總結(jié)
說(shuō)到這里,想必標(biāo)題的問(wèn)題以及下面的問(wèn)題你都清楚了:
安裝Python或者Jdk程序?yàn)槭裁匆O(shè)置PATH環(huán)境變量?如果不設(shè)置,該如何運(yùn)行?
除了./方式運(yùn)行自己的程序還有什么方式?
如果讓自己的程序能夠像內(nèi)置命令一樣被識(shí)別?
如何查看文件類(lèi)型?
執(zhí)行一條命令,如何確定是哪里的命令被執(zhí)行
本文涉及命令:
mv 移動(dòng)/重命名
file 查看文件信息
whereis 查看命令或者手冊(cè)位置
type 查看命令類(lèi)別
●編號(hào)616,輸入編號(hào)直達(dá)本文
●輸入m獲取文章目錄
C語(yǔ)言與C++編程分享C/C++技術(shù)文章
總結(jié)
以上是生活随笔為你收集整理的@echo off是什么意思_为什么执行自己的程序要在前面加./的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: rpc wmi 服务不可用_golang
- 下一篇: 语言里怎么防误输_育儿知识|我们的孩子为