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

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

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

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

    Также работает:

     cd "${0%/*}" 

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

    Попробуйте следующие простые однострочные:


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

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

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


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

     cd $(dirname $(realpath $0)) 

    Поддержка белых пространств:

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

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

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

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

    Для конкретных Linux:

     cd $(dirname $(readlink -f $0)) 

    Использование ссылки на чтение GNU на * BSD / Mac:

     cd $(dirname $(greadlink -f $0)) 

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


    В bash

    В bash вы можете использовать расширение параметров для достижения этого, например:

     cd ${0%/*} 

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

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

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

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

    или вот версия, взятая из файла Debian .bashrc :

     function realpath() { [email protected] if [ -d "$f" ]; then base="" dir="$f" else base="/$(basename "$f")" dir=$(dirname "$f") fi dir=$(cd "$dir" && /bin/pwd) echo "$dir$base" } 

    Связанный:

    • Как определить текущий каталог, в котором я запускаю сценарий оболочки?

    • Получение исходного каталога сценария Bash изнутри

    • Абсолютный путь к скрипту Bash с OSX

    • Надежный способ для сценария bash получить полный путь к самому себе?

    Смотрите также:

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

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

    Это просто. Оно работает.

    Этот скрипт, похоже, работает на меня:

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

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

    Получить реальный путь к вашему сценарию

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

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

     cd "`dirname $(readlink -f ${0})`" 

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

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

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

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

    Это будет cd в каталоге ~/bin/ а не в каталоге ~/project/ , который, вероятно, нарушит ваш скрипт, если цель cd должна включать зависимости от ~/project/

    Безопасный ответ на символическую ссылку приведен ниже:

     #!/bin/bash cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" 

    readlink -f требуется для разрешения абсолютного пути потенциально символического файла.

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

     echo $PWD 

    PWD – это переменная среды.

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

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

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

     chmod u+x test 

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

    Interesting Posts

    Как настроить Visual Studio на использование Beyond Compare

    когда статическая переменная загружается в java, время выполнения или время компиляции?

    ggplot2 heatmap с цветами для значений диапазона

    Как остановить неустойчивую работу зомби на Дженкинсе без перезапуска сервера?

    Жасмин: обратный вызов Async не вызывался в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL

    Возможно ли RDP в Windows Server 2008 на машине без какой-либо видеокарты или встроенной графики?

    Есть ли полная ссылка на реализацию IEquatable?

    Как получить элементы управления в WPF для заполнения свободного пространства?

    Entity Framework с XML-файлами

    Неужели мой жесткий диск неисправен?

    Как захватить ввод мягкой клавиатуры в режиме просмотра?

    Получение названий / значений наследуемых атрибутов с использованием Java Reflection

    Макрос макросов макросов

    Как статическая ссылка на OS X

    Может ли ответ AJAX установить cookie?

    Давайте будем гением компьютера.