Получить текущий каталог и конкатенацию пути

Это оболочка script (файл .sh). Мне нужно создать абсолютный путь, основанный на текущем каталоге. Я знаю о pwd, но как его связать с другой строкой? Вот пример того, что я пытаюсь сделать:

"$pwd/some/path"

Ответ 1

Похоже, вы хотите:

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), поэтому я стараюсь не использовать ее как можно больше. Только когда я уверен, что мне это нужно, например, установка команды через доморощенного.

Ответ 2

Использование встроенной оболочки 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 может быть символической ссылкой, поэтому определение истинного каталога происхождения является нетривиальным, особенно когда переносимость является обязательной.
Этот ответ (мой) показывает решение.

Ответ 3

wd=`pwd`
new_path="$wd/some/path"

Ответ 4

с "dirname $0" вы можете получить путь dynamin до текущего сеанса запуска. например: ваш файл локализован в папке с файлом оболочки, это xyz, и в файл xyz есть файл ancor abc. поэтому вставьте xyz файл LIke:

       php   "`dirname $0`"/abc.php