Как установить текущий рабочий каталог скрипта?

Я пишу bash-скрипт. Мне нужно, чтобы текущий рабочий каталог всегда был каталогом, в котором находится скрипт.

поведение по умолчанию заключается в том, что текущий рабочий каталог в скрипте-это оболочка, из которой я его запускаю, но я не хочу этого поведения.

10 ответов


#!/bin/bash
cd "$(dirname "")"

следующие работы:

cd "${0%/*}"

синтаксис подробно описан в этой ответ StackOverflow.


попробуйте следующие простые выражения:


для всех UNIX / OSX / Linux

dir=$(cd -P -- "$(dirname -- "")" && pwd -P)

Примечание: двойная тире ( -- ) используется в командах для обозначения конца параметров команды, поэтому файлы, содержащие тире или другие специальные символы, не нарушат команду.


для Linux, Mac и других *BSD:

cd $(dirname $(realpath ))

С поддержкой пробелов:

cd "$(dirname "$(realpath "")")";

Примечание.: realpath должен быть установлен в самом популярном дистрибутиве Linux по умолчанию (например, Ubuntu), но в некоторых он может отсутствовать, поэтому вам придется установить его.

в противном случае вы могли бы попробовать что-то подобное (он будет использовать существующий инструмент):

cd $(dirname $(readlink -f  || realpath ))

для Linux specific:

cd $(dirname $(readlink -f ))

использование GNU readlink на *BSD / Mac:

cd $(dirname $(greadlink -f ))

Примечание: Вы должны иметь coreutils установленные (например, 1. Установить доморощенного, 2. brew install coreutils).


в bash

в bash, вы можете использовать Разложений Параметра чтобы достичь этого, например:

cd ${0%/*}

но это не работает, если скрипт запускается из той же директории.

в качестве альтернативы вы можете определить следующую функцию в bash:

realpath () {
  [[  = /* ]] && echo "" || echo "$PWD/${1#./}"
}

эта функция принимает 1 аргумент. Если аргумент уже имеет абсолютный путь, распечатайте его как есть, иначе print $PWD переменная + аргумент filename (без ./ префикс).

или вот версия, взятая из Debian :

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"
}

по теме:

Читайте также:

как я могу получить поведение GNU readlink-f на Mac?


cd "$(dirname ${BASH_SOURCE[0]})"

Это легко. Это работает.


этот скрипт, кажется, работает для меня:

#!/bin/bash
mypath=`realpath `
cd `dirname $mypath`
pwd

командная строка pwd повторяет местоположение скрипта как текущий рабочий каталог независимо от того, где я его запускаю.


принятый ответ хорошо работает для скриптов, которые не были символически связаны в другом месте, например в $PATH.

#!/bin/bash
cd "$(dirname "")"

однако, если скрипт запускается через символическую ссылку,

ln -sv ~/project/script.sh ~/bin/; 
~/bin/script.sh

это будет cd в


сделать реальный путь к вашему скрипту

if [ -L  ] ; then
    ME=$(readlink )
else
    ME=
fi
DIR=$(dirname $ME)

(Это ответ на такой же мой вопрос здесь: получить имя каталога, в котором выполняется скрипт)


cd "`dirname $(readlink -f )`"

echo $PWD

PWD-переменная окружения.


Если вам просто нужно распечатать настоящий рабочий каталог, вы можете следовать этому.

$ vim test

#!/bin/bash
pwd
:wq to save the test file.

дать разрешение на выполнение:

chmod u+x test

затем выполните сценарий по ./test затем вы можете увидеть настоящий рабочий каталог.