情景l(fā)inux--shell腳本中的路徑問題

情景

使用shell編寫腳本時妓笙,經(jīng)常要使用到目錄和文件。而有時候,對于目錄和文件的使用總是達不到理想效果——目錄和文件總是不能在預想的位置創(chuàng)建旷赖,又或者,當把腳本移動到別的目錄執(zhí)行時更卒,卻不得不對修改腳本中文件或目錄的路徑等孵,否則便不能使用,等等蹂空。

舉個簡單的例子來說明這種情景俯萌。
~/temp目錄下創(chuàng)建兩個目錄:test1test2

$ pwd
/home/j-tester/temp
$ ls -1
test1
test2

test1目錄下創(chuàng)建一個名稱為getDate.sh的shell腳本,內(nèi)容如下:

$ pwd
/home/j-tester/temp/test1
$ cat getDate.sh 
date +%Y%m%d-%H%M%S > shijian.txt

腳本的需求是:
執(zhí)行date +%Y%m%d-%H%M%S命令上枕,并將命令的結果保存到該腳本所在的目錄下的shijian.txt文件中咐熙。

為其賦予執(zhí)行權限,然后運行它:

$ chmod +x getDate.sh
$ ./getDate.sh

查看當前目錄辨萍,確實產(chǎn)生了一個名為shijian.txt的文件棋恼,內(nèi)容是執(zhí)行腳本時的時間20170421-121406

$ ls -1
getDate.sh
shijian.txt
$ cat shijian.txt
20170421-121406

如果我們切換目錄到../test2/,然后執(zhí)行getDate.sh會發(fā)生什么呢锈玉?

$ cd ../test2/
$ pwd
/home/j-tester/temp/test2

切換了目錄爪飘,執(zhí)行時可以用絕對路徑執(zhí)行,也可以用相對路徑來執(zhí)行嘲玫,這里使用了相對路徑:

$ ../test1/getDate.sh

腳本執(zhí)行后悦施,查看../test1/目錄下的shijian.txt文件,內(nèi)容還是之前的時間20170421-121406去团,這說明腳本的執(zhí)行并未對test1目錄下的shijian.txt文件產(chǎn)生效果:

$ ls -1 ../test1/
getDate.sh
shijian.txt
$ cat ../test1/shijian.txt 
20170421-121406

而查看此時的當前目錄(/home/j-tester/temp/test2)抡诞,卻有一個shijian.txt文件,內(nèi)容中的時間比之前的時間要新20170421-121833土陪,而這正是進入到test2目錄之后執(zhí)行腳本時的時間:

$ ls -1
shijian.txt
$ cat shijian.txt 
20170421-121833

由上昼汗,可以預見的是,在不同的目錄下執(zhí)行getDate.sh文件鬼雀,都會在這些目錄下產(chǎn)生shijian.txt文件顷窒。這與預期的在getDate.sh腳本所在的目錄下產(chǎn)生shijian.txt文件的需求是不符的。

其實源哩,不僅僅是上面這個腳本鞋吉,許多腳本都有這樣的現(xiàn)象:只有在進入了腳本所在的目錄下執(zhí)行腳本,才會產(chǎn)生預期的效果励烦。在windows系列系統(tǒng)中也有軟件有這樣的情況:一個可執(zhí)行文件谓着,使用絕對路徑或相對路徑執(zhí)行它時會沒有效果或者干脆直接報錯,而只有先進入到這個可執(zhí)行文件所在的目錄后坛掠,再執(zhí)行它才可以正常使用赊锚。

這是因為治筒,正常情況下,這類腳本預期的執(zhí)行目錄是它所在的目錄舷蒲,而當你在其它目錄執(zhí)行它時就會出現(xiàn)這樣那樣的問題耸袜。

本文主要討論這類問題該如何解決。

方案

方案一

可以為用到的目錄或文件設置絕對路徑牲平。

在上例中堤框,可以用絕對路徑表示shijian.txt,就可以實現(xiàn)無論在任何目錄執(zhí)行getDate.sh欠拾,其輸出都是~/temp/test1/shijian.txt胰锌。

$ cat ~/temp/test1/getDate.sh 
date +%Y%m%d-%H%M%S > ~/temp/test1/shijian.txt

這樣做的弊端是:
getDate.sh移動到別的目錄執(zhí)行時,產(chǎn)生的文件shijian.txt還是原來的目錄藐窄,而非新目錄资昧。所以,當移動腳本后荆忍,還需要修改腳本中的絕對路徑格带。

方案二

既然腳本中使用的目錄或文件期望基于腳本的所在目錄,那么可以在腳本中先進入到這個目錄里刹枉,后續(xù)要使用目錄和文件時叽唱,都基于此目錄,用相對路徑描述微宝。

具體做法:

我們知道棺亭,shell中有幾個特殊的變量,其中$0表示shell腳本本身的文件名蟋软。
命令dirname是去掉后接參數(shù)的非目錄的后綴镶摘,所以dirname $0就是腳本所在的目錄:

$ pwd
/home/j-tester/temp

修改腳本的內(nèi)容如下:

$ cat ./test1/getDate.sh 
echo "shell name is:$0"
echo "shell dir is :`dirname $0`"
date +%Y%m%d-%H%M%S > shijian.txt

使用相對路徑執(zhí)行腳本:

$ ./test1/getDate.sh 
shell name is:./test1/getDate.sh
shell dir is :./test1

使用絕對路徑執(zhí)行腳本:

$ ~/temp/test1/getDate.sh 
shell name is:/home/j-tester/temp/test1/getDate.sh
shell dir is :/home/j-tester/temp/test1

在腳本所在目錄,用相對路徑執(zhí)行腳本:

$ cd test1
$ ./getDate.sh 
shell name is:./getDate.sh
shell dir is :.

通過上述結果可知岳守,我們可以使用命令替換的方式凄敢,先cd進入到腳本所在的目錄,然后使用pwd命令返回目錄的絕對路徑湿痢,將這個路徑保持到變量里涝缝,以便后續(xù)調(diào)用

更進一步譬重,可以將獲取腳本所在目錄優(yōu)化為一句話代碼

path="$(cd "$(dirname $0)";pwd)"

如果要進入這個目錄拒逮,只需執(zhí)行:

cd ${path}

如果你還希望在腳本中使用你執(zhí)行腳本時所在的目錄,可以在這之前臀规,把pwd命令的結果保存到一個變量里:

run_path=`pwd`

使用相對路徑的好處在于:
無需因為腳本的絕對路徑發(fā)生了變化而不得不修改腳本中的相關路徑消恍。

當然,有時候使用絕對路徑是在所難免的以现,但只要你進行了這方面的處理狠怨,腳本就會變得更通用,維護成本低很多邑遏。

擴展知識

  • 相對路徑和絕對路徑
  • 特殊變量佣赖,如$0
  • 命令替換$()
  • 雙引號""和反引號``的使用
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市记盒,隨后出現(xiàn)的幾起案子憎蛤,更是在濱河造成了極大的恐慌,老刑警劉巖纪吮,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩檬,死亡現(xiàn)場離奇詭異,居然都是意外死亡碾盟,警方通過查閱死者的電腦和手機棚辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冰肴,“玉大人屈藐,你說我怎么就攤上這事∥跷荆” “怎么了联逻?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長检痰。 經(jīng)常有香客問我包归,道長,這世上最難降的妖魔是什么铅歼? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任公壤,我火速辦了婚禮,結果婚禮上谭贪,老公的妹妹穿的比我還像新娘境钟。我一直安慰自己,他們只是感情好俭识,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布慨削。 她就那樣靜靜地躺著,像睡著了一般套媚。 火紅的嫁衣襯著肌膚如雪缚态。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天堤瘤,我揣著相機與錄音玫芦,去河邊找鬼。 笑死本辐,一個胖子當著我的面吹牛桥帆,可吹牛的內(nèi)容都是我干的医增。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼老虫,長吁一口氣:“原來是場噩夢啊……” “哼叶骨!你這毒婦竟也來了?” 一聲冷哼從身側響起祈匙,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤忽刽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夺欲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪帝,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年些阅,在試婚紗的時候發(fā)現(xiàn)自己被綠了伞剑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡扑眉,死狀恐怖纸泄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰素,我是刑警寧澤聘裁,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站弓千,受9級特大地震影響衡便,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洋访,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一镣陕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姻政,春花似錦呆抑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至食绿,卻和暖如春侈咕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背器紧。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工耀销, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铲汪。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓熊尉,卻偏偏與公主長得像罐柳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帽揪,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu士飒,源于非洲祖魯人和科薩人的語言查邢,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,197評論 9 467
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理酵幕,服務發(fā)現(xiàn)扰藕,斷路器,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • 什么是shell shell 是一個命令語言解釋器(command-language interpreter)芳撒。 ...
    Arteezy_Xie閱讀 1,057評論 0 0
  • ???????? ??????????????????????????...
    slzm閱讀 707評論 0 0
  • 通過親子時間管理的研習和踐行笔刹。我越來越覺得家庭的互動和成長太重要了芥备。 家庭是傳遞愛的載體,從父母傳給孩子...
    一然媽媽閱讀 635評論 3 0