2009-01-07 23 views
10

我想要做的是將文件中的設置包含到當前的交互式bash shell中,如下所示:bash腳本如何知道它在何時被安裝的目錄。運營商?

$。 /path/to/some/dir/.settings

問題是.settings腳本也需要使用「。」運營商包括這樣的其他文件:

。 .extra_settings

如何在.settings文件中引用.extra_settings的相對路徑?這兩個文件始終存儲在同一目錄中,但根據安裝這些文件的位置,此目錄的路徑將有所不同。

操作員總是知道/ path/to/some/dir /,如上所示。 .settings文件如何知道它的安裝目錄?我寧願沒有安裝過程記錄已安裝目錄的名稱。

回答

17

衍生彈相信$(dirname "$BASH_SOURCE")會做你想要什麼,只要你是採購文件是一個符號鏈接。

如果您正在輸出可能是一個符號鏈接的文件,你可以這樣做以下,以獲得真正的目錄:

PRG="$BASH_SOURCE" 
progname=`basename "$BASH_SOURCE"` 

while [ -h "$PRG" ] ; do 
    ls=`ls -ld "$PRG"` 
    link=`expr "$ls" : '.*-> \(.*\)$'` 
    if expr "$link" : '/.*' > /dev/null; then 
     PRG="$link" 
    else 
     PRG=`dirname "$PRG"`"/$link" 
    fi 
done 

dir=$(dirname "$PRG") 
+0

完美。 $(dirname「$ BASH_SOURCE」)就是我正在尋找的東西。爲了我的目的,我不太關心符號鏈接。感謝所有的迴應。這裏真的很好的答案。 – Gary 2009-01-07 21:32:19

+8

要解析符號鏈接,你可以這樣做:`dir = $(dirname $(readlink -f「$ BASH_SOURCE」))` – 2010-07-18 16:57:14

0

我嘗試了$(dirname $ 0)的變體,但當.settings文件包含在「。」中時失敗。如果我正在執行.settings文件而不是包含它,則此解決方案將起作用。相反,$(dirname $ 0)總是返回「。」,表示當前目錄。當做這樣的事情時會失敗:

$ cd/ $。 /some/path/.settings

+0

嗯,太糟糕了。我不知道那麼 – 2009-01-07 21:09:38

2

不同的問題 - 如果您使用的是「。」爲了設置環境變量,這樣做的另一個標準方法是讓你的腳本回聲變量設置命令,例如:

# settings.sh 
echo export CLASSPATH=${CLASSPATH}:/foo/bar 

然後EVAL輸出:

eval $(/path/to/settings.sh) 

那怎麼包,比如modules工作。這種方式也可以很容易地支持從SH(X=...; export X)和csh(setenv X ...

+0

對,這就是INN如何做到的。 「innconfvar」(我認爲這就是所謂的)發出配置變量爲sh,csh或perl命令。 – 2009-01-07 20:45:28

+0

我喜歡這個想法。但是,我沒有使用它,因爲副作用會使得.settings文件更難以閱讀,因爲它已經有了大量的轉義符。見下文。 – Gary 2009-01-07 21:37:29

0

這類作品。它的工作原理是,你可以在.settings文件中使用$(dirname $ 0)語法來確定它的home,因爲你在一個新shell中執行這個腳本。然而,它增加了在那裏你需要改變線路,如卷積額外的一層:

export MYDATE=$(date) 

echo "export MYDATE=\$(date)" 

也許這是唯一的辦法?

6

這裏是什麼可能是一個完美的解決方案:

script_dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) 

這不會,但是,採購環節時的工作。在這種情況下,人們可能會做

script_dir=$(readlink -f $(readlink "${BASH_SOURCE[0]}") 

要潔具,像${array[x]}陣列POSIX不兼容。當然,BASH_SOURCE陣列僅在Bash中可用。

相關問題