Jak Mogę ustawić bieżący katalog roboczy na katalog skryptu w Bash?
Piszę skrypt Basha. Bieżący katalog roboczy musi być zawsze katalogiem, w którym znajduje się skrypt.
Domyślnym zachowaniem jest to, że bieżący katalog roboczy w skrypcie jest katalogiem powłoki, z której go uruchamiam, ale nie chcę tego zachowania.
11 answers
#!/bin/bash
cd "$(dirname "$0")"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 21:46:25
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 22:08:23
Wypróbuj następujące proste jednolinijki:
Dla wszystkich UNIX/OSX/Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bash
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Uwaga: w poleceniach używana jest Podwójna myślnik (--) oznaczający koniec opcji poleceń, więc pliki zawierające myślniki lub inne znaki specjalne nie będą łamać polecenia.
Uwaga: w Bash użyj ${BASH_SOURCE[0]}
na rzecz $0
, w przeciwnym razie ścieżka może się złamać podczas jej pozyskiwania (source
/.
).
Dla Linuksa, Maca i innych * BSD:
cd "$(dirname "$(realpath "$0")")";
Uwaga: {[13] } powinien być zainstalowany w najpopularniejszej dystrybucji Linuksa domyślnie( jak Ubuntu), ale w niektórych może go zabraknąć, więc musisz go zainstalować.
Uwaga: Jeśli używasz Bash, użyj ${BASH_SOURCE[0]}
na rzecz $0
, w przeciwnym razie ścieżka może się złamać podczas jej pozyskiwania (source
/.
).
W przeciwnym razie możesz spróbować czegoś takiego (użyje pierwszego istniejącego narzędzia):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Dla Linuksa specyficzny:
cd "$(dirname "$(readlink -f "$0")")"
Używanie GNU readlink na *BSD/Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Uwaga: musisz mieć coreutils
zainstalowany
(np. 1. Install Homebrew , 2. brew install coreutils
).
W bash
W bash możesz użyć rozszerzenia parametrów , aby to osiągnąć, jak:
cd "${0%/*}"
Ale to nie działa, jeśli skrypt jest uruchamiany z tego samego katalogu.
Alternatywnie można zdefiniować następującą funkcję w bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Funkcja ta przyjmuje 1 argument. Jeśli argument ma już ścieżkę bezwzględną, wypisuje ją taką jaka jest, w przeciwnym razie wypisuje zmienną $PWD
+ argument nazwy pliku (bez prefiksu ./
).
Lub tutaj jest wersja pobrana z pliku Debian .bashrc
:
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Powiązane:
Jak wykryć bieżący katalog, w którym uruchamiam skrypt powłoki?
Pobierz katalog źródłowy skryptu Bash z wewnątrz sam scenariusz
Niezawodny sposób na skrypt Bash, aby uzyskać pełną ścieżkę do siebie
Zobacz też:
Jak mogę sprawdzić zachowanie READLINK-F GNU na komputerze Mac?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-24 09:00:52
cd "$(dirname "${BASH_SOURCE[0]}")"
To proste. To działa.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-06 20:56:38
Zaakceptowana odpowiedź działa dobrze w przypadku skryptów, które nie zostały połączone symbolicznie gdzie indziej, np. w $PATH
.
#!/bin/bash
cd "$(dirname "$0")"
Jednak jeśli skrypt jest uruchamiany przez dowiązanie symboliczne,
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
Będzie to cd do katalogu ~/bin/
, a nie katalogu ~/project/
, który prawdopodobnie złamie twój skrypt, jeśli celem cd
jest włączenie zależności względem ~/project/
Bezpieczna odpowiedź symboliczna znajduje się poniżej:
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
readlink -f
jest wymagane do rozwiązania bezwzględnej ścieżki potencjalnie dowiązany symbolicznie plik.
Cudzysłowy są wymagane do obsługi ścieżek plików, które potencjalnie mogą zawierać białe znaki (zła praktyka, ale nie można bezpiecznie zakładać, że tak nie będzie)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 10:49:02
Ten skrypt wydaje mi się działać:
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
Wiersz poleceń pwd wyświetla lokalizację skryptu jako bieżący katalog roboczy, bez względu na to, skąd go uruchamiam.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 00:59:56
Get the real path to your script
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(jest to odpowiedź na to samo moje pytanie tutaj: Pobierz nazwę katalogu, w którym wykonywany jest skrypt )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:41
Biorę to i działa.
#!/bin/bash
cd "$(dirname "$0")"
CUR_DIR=$(pwd)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-08 03:16:59
cd "`dirname $(readlink -f ${0})`"
echo $PWD
PWD jest zmienną środowiskową.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-06 00:33:12
Jeśli potrzebujesz wydrukować bieżący katalog roboczy, możesz to zrobić.
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
Dać pozwolenie na wykonanie:
chmod u+x test
Następnie wykonaj skrypt przez {[2] } wtedy możesz zobaczyć obecny katalog roboczy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 16:56:22