2014-11-23 66 views
0

所以我是Linux的新手,需要一些幫助。我必須編寫一個bash腳本,在腳本中,我必須使用腳本的父目錄在腳本的任何位置創建一個文件。它應該看起來像這樣:腳本的父目錄

如果我的腳本位於「/ home/student /」中,則需要使用in-script命令創建另一個名爲txt的文件/ home /。請有任何想法嗎?謝謝。

回答

1

使用..指向父目錄。所以你可以用類似

MY_SCRIPTDIR="$(dirname $0)" 
touch ${MY_SCRIPTDIR}/../abc.txt 

從你的命令提示符或shell腳本中創建一個文件。

+0

'..'是相對於當前目錄,而不是腳本所在的目錄。你需要從'$ 0'獲取腳本位置。 – 2014-11-23 09:46:58

+0

是的假設OP知道腳本在哪裏運行。但將修改答案更具體。謝謝。 – SMA 2014-11-23 09:50:59

2

如果你想能夠從任何地方運行你的腳本,這是一個微妙之處。

例如:如果您的腳本在/home/myHome/someDir/someOther中,並且您希望在運行腳本時無論身在何處都可以在/home/myHome/someDir中創建文件。

要解決這個問題,你只需要首先派生腳本所在的目錄。

這是可以做到用:

SCRIPT_DIRECTORY="$(dirname "$0")" 
touch "$SCRIPT_DIRECTORY/../myFile.txt" 

編輯:實際上,它可以更加微妙,如果你要處理的符號鏈接。即:如果符號鏈接/home/myHome/mySymlink點在你的腳本,而且是一個實際被調用,那麼前面的腳本將考慮/home/myHome/,而不是/home/myHome/someDir/someOther

要處理這種情況下,你可以做

if [ -L "$0" ] && [ -x $(which readlink) ]; then 
    ACTUAL_SCRIPT_FILE="$(readlink -mn "$0")" 
else 
    ACTUAL_SCRIPT_FILE="$0" 
fi 
SCRIPT_DIRECTORY="$(dirname "$ACTUAL_SCRIPT_FILE")" 
touch "$SCRIPT_DIRECTORY/../myFile.txt" 
+1

'cd'有點太多了,並且有副作用(順便說一下,你需要'cd -'回到最後或使用'pushd' /'popd')。爲什麼不只是'SCRIPT_DIR =「$(dirname $ 0)」'並使用相對路徑? – 2014-11-23 09:44:51

+0

看來你是對的:'SCRIPT_DIR =「$(dirname $ 0)」'工作。感謝您指出 – gturri 2014-11-23 09:50:04

+0

請在回答中使用引用的版本:'「$(dirname $ 0)」''和$「SCRIPT_DIRECTORY /../ myFile.txt」'。 – 2014-11-23 09:51:41

0

不幸的是,其他答案或者給你當前的工作目錄而不是腳本所在的目錄,或者如果腳本或者其中一個目錄是符號鏈接而不是真實目錄,它們將不起作用。

什麼工作是:

dirname $(readlink -f "$0") 

說明:

  • 「$ 0」 是你在命令行中鍵入它的腳本的名稱。引用對於包含空格的情況很重要。
  • readlink將解決沿途的任何符號鏈接
  • dirname只需目錄名稱從腳本的完整路徑 - 這是更好的可讀性,更安全的角落情況下比手動尋找斜線等

現在,你將得到即使在複雜的情況下,正確的結果:如果你的腳本是在/tmp,你在/tmp/abc/創建符號鏈接到它,並且你的當前目錄將是/home並運行/tmp/abc/your-script,使其能正確輸出/tmp,不/home也不/tmp/abc

+0

我認爲這樣的答案應該以''開頭「假設你需要使用原始腳本的位置,當你在不同的路徑下創建它的符號鏈接...」。 – 2014-11-23 10:01:58