Обратитесь к текущему каталогу в оболочке script

Как мне обратиться к текущему каталогу в оболочке script

Итак, у меня есть этот script, который вызывает другой script в том же каталоге

#! /bin/sh

#Call the other script
./foo.sh 

# do something ...

Для этого я получил ./foo.sh: No such file or directory

Поэтому я изменил его на:

#! /bin/sh

#Call the other script
foo.sh 

# do something ...

Но это вызовет foo script, который по умолчанию находится в PATH. Это не то, что я хочу.

Итак, вопрос в том, что синтаксис выполнения './`в оболочке script?

Ответ 1

Если оба сценария находятся в одном каталоге, и вы получили ошибку ./foo.sh: No such file or directory, то наиболее вероятной причиной является то, что вы запустили первый script из другого каталога, чем тот, где они находятся. Поставьте следующее в вашем первом script, чтобы вызов foo.sh работал независимо от того, где вы вызываете первый script из:

my_dir=`dirname $0`
#Call the other script
$my_dir/foo.sh

Ответ 2

Следующий код хорошо работает с пробелами и не требует работы bash:

#!/bin/sh

SCRIPTDIR="$(dirname "$0")"

#Call the other script
"$SCRIPTDIR/foo.sh"

Также, если вы хотите использовать абсолютный путь, вы можете сделать это:

SCRIPTDIR=`cd "$(dirname "$0")" && pwd`

Ответ 4

Принятое решение не работает, если у вас есть пробел в пути к каталогу, содержащему сценарии.

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

#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
"${SCRIPTDIR}/foo.sh"

Ответ 5

Чтобы сделать его POSIX:

a="/$0"; a=${a%/*}; a=${a:-.}; a=${a#/}/; BASEDIR=$(cd $a; pwd)

Протестировано на многих совместимых с Bourne оболочках, включая BSD.

Насколько я знаю, я автор, и я помещаю его в общественное достояние. Для получения дополнительной информации см.: https://blog.jasan.tk/posix/2017/05/11/posix_shell_dirname_replacement

Ответ 6

script_dir="${BASH_SOURCE%/*}" # rm the last/and the file name from BASH_SOURCE

$script_dir/foo.sh

Ссылка: Alex Che комментарий выше.