Обратитесь к текущему каталогу в оболочке 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`
Ответ 3
Это может помочь вам:
Unix shell script узнать, в какой папке находится файл script?
Но, как заявил sarnold, "./" для текущего рабочего каталога.
Ответ 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 комментарий выше.