Получить исходный каталог скрипта Bash из самого скрипта - PullRequest
4414 голосов
/ 13 сентября 2008

Как получить путь к каталогу, в котором находится сценарий Bash , внутри этого сценария?

Например, допустим, я хочу использовать скрипт Bash в качестве средства запуска для другого приложения. Я хочу изменить рабочий каталог на тот, где находится скрипт Bash, чтобы я мог работать с файлами в этом каталоге, например так:

$ ./application

Ответы [ 58 ]

5 голосов
/ 23 сентября 2010

Ничего из этого не работало для скрипта bash, запущенного Finder в OS X - в итоге я использовал:

SCRIPT_LOC="`ps -p $$ | sed /PID/d | sed s:.*/Network/:/Network/: |
sed s:.*/Volumes/:/Volumes/:`"

Не красиво, но оно выполняет свою работу.

5 голосов
/ 11 апреля 2017

Это сработало для меня, когда другие ответы здесь не:

thisScriptPath=`realpath $0`
thisDirPath=`dirname $thisScriptPath`
echo $thisDirPath
4 голосов
/ 14 апреля 2009

Это единственный надежный способ сказать:

SCRIPT_DIR=$(dirname $(cd "$(dirname "$BASH_SOURCE")"; pwd))
3 голосов
/ 13 октября 2010

Используйте комбинацию readlink для канонизации имени (с бонусом последующего его возврата к его источнику, если это символическая ссылка) и dirname для извлечения имени каталога:

script="`readlink -f "${BASH_SOURCE[0]}"`"
dir="`dirname "$script"`"
3 голосов
/ 04 февраля 2017

$0 не является надежным способом получения текущего пути к сценарию. Например, это мой .xprofile:

#!/bin/bash
echo "$0 $1 $2"
echo "${BASH_SOURCE[0]}"
# $dir/my_script.sh &

cd / tmp && ~ / .xprofile && source ~ / .xprofile

/home/puchuu/.xprofile  
/home/puchuu/.xprofile
-bash  
/home/puchuu/.xprofile

Поэтому, пожалуйста, используйте BASH_SOURCE.

1 голос
/ 01 июня 2018

Если ваш сценарий BASH является символом, то это способ сделать это

#!/usr/bin/env bash

dirn="$(dirname "$0")"
rl="$(readlink "$0")";
exec_dir="$(dirname $(dirname "$rl"))";
my_path="$dirn/$exec_dir";
X="$(cd $(dirname ${my_path}) && pwd)/$(basename ${my_path})"

X - это каталог, в котором содержится ваш bash-скрипт (оригинальный файл, а не символическая ссылка). Клянусь Богом, это работает, и это единственный способ, которым я знаю, как делать это правильно.

1 голос
/ 17 мая 2019

Это довольно старый вопрос, но я все равно добавлю свой ответ. Я обычно использую

dirname $(which $BASH_SOURCE)
0 голосов
/ 03 февраля 2017

Этот однострочный работает на CYGWIN, даже если скрипт был вызван из Windows с bash -c <script>:

set mydir="$(cygpath "$(dirname "$0")")"
0 голосов
/ 24 октября 2016

Исходя из этого ответа , я предлагаю уточненную версию, которая получает SCRIPT_HOME в качестве папки, содержащей любой текущий запущенный скрипт bash

s=${BASH_SOURCE[0]} ; s=`dirname $s` ; SCRIPT_HOME=`cd $s ; pwd`
echo $SCRIPT_HOME
0 голосов
/ 31 марта 2016

Посмотрите на тест внизу со странными именами каталогов.

Чтобы изменить рабочий каталог на каталог, в котором находится скрипт Bash, вам следует попробовать это простое, проверенное и проверенное с помощью shellcheck решение:

#!/bin/bash --
cd "$(dirname "${0}")"/. || exit 2

Тест:

$ ls 
application
$ mkdir "$(printf "\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\40\41\42\43\44\45\46\47testdir" "")"
$ mv application *testdir
$ ln -s *testdir "$(printf "\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\40\41\42\43\44\45\46\47symlink" "")"
$ ls -lb
total 4
lrwxrwxrwx 1 jay stacko   46 Mar 30 20:44 \001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\ !"#$%&'symlink -> \001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\ !"#$%&'testdir
drwxr-xr-x 2 jay stacko 4096 Mar 30 20:44 \001\002\003\004\005\006\a\b\t\n\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\ !"#$%&'testdir
$ *testdir/application && printf "SUCCESS\n" ""
SUCCESS
$ *symlink/application && printf "SUCCESS\n" ""
SUCCESS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...