Это оболочка script (файл .sh). Мне нужно создать абсолютный путь, основанный на текущем каталоге. Я знаю о pwd
, но как его связать с другой строкой? Вот пример того, что я пытаюсь сделать:
"$pwd/some/path"
Это оболочка script (файл .sh). Мне нужно создать абсолютный путь, основанный на текущем каталоге. Я знаю о pwd
, но как его связать с другой строкой? Вот пример того, что я пытаюсь сделать:
"$pwd/some/path"
Похоже, вы хотите:
path="$(pwd)/some/path"
$(
открывает подоболочку (и )
закрывает ее), где содержимое выполняется как script, поэтому любые выходы помещаются в это место в строке.
Полезнее часто получать каталог script, который запущен:
dot="$(cd "$(dirname "$0")"; pwd)"
path="$dot/some/path"
Это более полезно, потому что он разрешает один и тот же путь независимо от того, где вы находитесь, когда вы запускаете script:
> pwd
~
> ./my_project/my_script.sh
~/my_project/some/path
а не:
> pwd
~
> ./my_project/my_script.sh
~/some/path
> cd my_project
> pwd
~/my_project
> ./my_script.sh
~/my_project/some/path
Более сложный, но если вам нужен каталог текущего script, если он был выполнен через символическую ссылку (обычно при установке скриптов через homebrew, например), вам нужно проанализировать и следовать символической ссылке:
if [[ "$OSTYPE" == *darwin* ]]; then
READLINK_CMD='greadlink'
else
READLINK_CMD='readlink'
fi
dot="$(cd "$(dirname "$([ -L "$0" ] && $READLINK_CMD -f "$0" || echo "$0")")"; pwd)"
Более сложные и дополнительные требования для его работы (например, с установленной совместимой с gnu readlink), поэтому я стараюсь не использовать ее как можно больше. Только когда я уверен, что мне это нужно, например, установка команды через доморощенного.
Использование встроенной оболочки pwd
в подстановке команд ($(...)
) является необязательным, но необязательным, поскольку все POSIX-совместимые оболочки определяют специальную переменную оболочки $PWD
, которая содержит текущий каталог как абсолютный путь, назначенный POSIX.
Таким образом, с использованием $PWD
является более простым и эффективным, чем $(pwd)
:
"$PWD/some/path" # alternatively, for visual clarity: "${PWD}/some/path"
Однако , если вы хотите разрешить символические ссылки в пути к каталогам, вам нужно pwd
, с опцией -P
:
"$(pwd -P)/some/path"
Обратите внимание, что POSIX требует, чтобы $PWD
содержал абсолютный путь с устраненными символическими ссылками.
На практике, однако, NO основной POSIX-подобной оболочки (bash
, dash
, ksh
, zsh
) делает это - все они сохраняют символические компоненты ссылок. Таким образом, для их решения требуется pwd -P
.
Майкл Аллен: полезный ответ указывает, что обычно хочет узнать каталог, где находится script.
Задача заключается в том, что сам файл script может быть символической ссылкой, поэтому определение истинного каталога происхождения является нетривиальным, особенно когда переносимость является обязательной.
Этот ответ (мой) показывает решение.
wd=`pwd`
new_path="$wd/some/path"
с "dirname $0
" вы можете получить путь dynamin до текущего сеанса запуска.
например: ваш файл локализован в папке с файлом оболочки, это xyz, и в файл xyz есть файл ancor abc.
поэтому вставьте xyz файл LIke:
php "`dirname $0`"/abc.php