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.

Author: Peter Mortensen, 2010-07-28

11 answers

#!/bin/bash
cd "$(dirname "$0")"
 737
Author: ndim,
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

Działa również:

cd "${0%/*}"

Składnia jest dokładnie opisana w tej odpowiedzi Stoskoverflow.

 339
Author: Paul Schulz,
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:

Zobacz też:

Jak mogę sprawdzić zachowanie READLINK-F GNU na komputerze Mac?

 206
Author: kenorb,
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.
 81
Author: Dan Moulding,
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)

 8
Author: James McGuigan,
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.

 4
Author: Amardeep AC9MF,
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 )

 2
Author: rodnower,
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)
 2
Author: Robert Hu,
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})`"
 1
Author: ,
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
2015-10-27 06:16:32
echo $PWD
PWD jest zmienną środowiskową.
 -5
Author: Maverick Holdem,
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.

 -7
Author: Chandan,
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