Относительный путь Bash к абсолютному пути [дубликат]

Попробуйте поместить document.getElementById в setTimeout()

Например.

setTimeout(function(){
    console.log(document.getElementById('whatever'));
}, 100);

Если это сработает, тогда это просто проблема синхронизации.

63
задан BobMcGee 10 July 2013 в 18:27
поделиться

7 ответов

Чтобы получить полный путь использования:

readlink -f relative/path/to/file

Чтобы получить каталог файла:

dirname relative/path/to/file

Вы также можете объединить два:

dirname $(readlink -f relative/path/to/file)

Если readlink -f недоступно в вашей системе, вы можете использовать это:

function myreadlink() {
  (
  cd $(dirname $1)         # or  cd ${1%/*}
  echo $PWD/$(basename $1) # or  echo $PWD/${1##*/}
  )
}

Обратите внимание, что если вам нужно только перейти в каталог файла, указанного как относительный путь, вам не нужно знать абсолютный путь, относительный путь совершенно легален, поэтому просто используйте:

cd $(dirname relative/path/to/file)

, если вы хотите вернуться (во время работы скрипта) к исходному пути, используйте pushd вместо cd и popd, когда вы закончите.

126
ответ дан Chen Levy 19 August 2018 в 00:34
поделиться
  • 1
    Обратите внимание, что readlink -f, к сожалению, не работает на OS X. – Emil Sit 10 July 2013 в 18:33
  • 2
    Мне не нужен весь путь, я просто хочу папку. Но это предлагает достаточно, чтобы быть полезным: readlink -f relativeFileLocation | xargs dirname – BobMcGee 10 July 2013 в 18:38
  • 3
    @EmilSit: вы правы. Но вы можете brew install coreutils получить его. stackoverflow.com/a/4031502/1022967 . – mpettis 26 February 2016 в 19:47
  • 4
    – Camilo Martin 29 September 2016 в 16:04
  • 5
    @ChenLevy Некоторые люди могут быть склонны использовать его ради ускорения (я думаю, basename / dirname не встроены), и они будут видеть, что он работает сначала, но внезапно разбивается в какой-то момент будущее, по-видимому, без веской причины. Я бы избегал предлагать это как вариант или отказываться от того, что на самом деле это не пуленепробиваемый супберт. – Camilo Martin 29 September 2016 в 18:09

Попробуйте наш новый продукт библиотеки Bash realpath-lib в GitHub, который мы предоставили сообществу для бесплатного и неограниченного использования. Это чисто, просто и хорошо документировано, и это здорово учиться. Вы можете сделать:

get_realpath <absolute|relative|symlink|local file path>

Эта функция является ядром библиотеки:

if [[ -f "$1" ]]
then
    # file *must* exist
    if cd "$(echo "${1%/*}")" &>/dev/null
    then
        # file *may* not be local
        # exception is ./file.ext
        # try 'cd .; cd -;' *works!*
        local tmppwd="$PWD"
        cd - &>/dev/null
    else
        # file *must* be local
        local tmppwd="$PWD"
    fi
else
    # file *cannot* exist
    return 1 # failure
fi

# reassemble realpath
echo "$tmppwd"/"${1##*/}"
return 0 # success

}

Это Bash 4+, не требует никаких зависимостей, а также предоставляет get_dirname, get_filename, get_stemname и validate_path.

1
ответ дан AsymLabs 19 August 2018 в 00:34
поделиться
$cat abs.sh
#!/bin/bash
echo "$(cd "$(dirname "$1")"; pwd -P)"

Некоторые объяснения:

  1. Этот скрипт получает относительный путь как аргумент "$1"
  2. Затем мы получаем dirname часть этого path (вы можете передать либо dir, либо файл в этот скрипт): dirname "$1"
  3. Затем мы cd "$(dirname "$1"); в этот относительный dir
  4. pwd -P и получаем абсолютный путь. Опция -P позволит избежать символических ссылок
  5. . В качестве последнего шага мы echo это

Затем запустите свой скрипт:

abs.sh your_file.txt
1
ответ дан Eugen Konkov 19 August 2018 в 00:34
поделиться

Это будет работать как для файла, так и для папки:

absPath(){
    if [[ -d "$1" ]]; then
        cd "$1"
        echo "$(pwd -P)"
    else 
        cd "$(dirname "$1")"
        echo "$(pwd -P)/$(basename "$1")"
    fi
}
5
ответ дан Jahid 19 August 2018 в 00:34
поделиться

Я использовал readlink -f для linux

, поэтому

FULL_PATH=$(readlink -f filename)
DIR=$(dirname $FULL_PATH)

PWD=$(pwd)

cd $DIR

#<do more work>

cd $PWD
0
ответ дан Mehul Rathod 19 August 2018 в 00:34
поделиться
  • 1
    не используйте имена переменных верхнего регистра в Bash, он однажды столкнется с уже существующими переменными ... oh, и этот день теперь: знаете ли вы, что переменная PWD уже существует в Bash, а ее значение фактически является текущим каталогом ? И используйте больше цитат. – gniourf_gniourf 10 July 2013 в 22:45
  • 2
    Большое спасибо, я буду помнить об этом. – Mehul Rathod 10 July 2013 в 23:26

Проблема с приведенным выше ответом идет с файлами ввода с "./" как. ./my-file.txt"

Обходное решение (из многих):

    myfile="./somefile.txt"
    FOLDER="$(dirname $(readlink -f "${ARG}"))"
    echo ${FOLDER}
0
ответ дан Mike Q 19 August 2018 в 00:34
поделиться

Взгляните на страницу man для realpath, я использую это и что-то вроде:

CONTAININGDIR = $ (realpath $ {FILEPATH% / *})

< / blockquote>

, чтобы сделать то, что звучит так, как вы пытаетесь сделать.

18
ответ дан Richard Sitze 19 August 2018 в 00:34
поделиться
  • 1
    realpath делает мне странное, где он решает символические ссылки относительных dirs – Erik Aronesty 8 June 2015 в 20:19
  • 2
    Благодаря! Работал для меня в Mac OS – Dmitry Klochkov 7 October 2016 в 13:27
Другие вопросы по тегам:

Похожие вопросы: