Могу ли я получить абсолютный путь к текущему скрипту в KornShell?

Способ иметь отдельную реализацию выглядит следующим образом.

//inner_foo.h

template <typename T>
struct Foo
{
    void doSomething(T param);
};


//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
    //implementation
}


//foo.h
#include <foo.tpp>

//main.cpp
#include <foo.h>

inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.

Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.

Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.

22
задан javaPlease42 15 January 2014 в 00:15
поделиться

7 ответов

Вы можете использовать:

## __SCRIPTNAME - name of the script without the path
##
typeset -r __SCRIPTNAME="${0##*/}"

## __SCRIPTDIR - path of the script (as entered by the user!)
##
__SCRIPTDIR="${0%/*}"

## __REAL_SCRIPTDIR - path of the script (real path, maybe a link)
##
__REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
27
ответ дан 29 November 2019 в 03:48
поделиться

Как был вызван скрипт, хранится в переменной $ 0. Вы можете использовать readlink , чтобы получить абсолютное имя файла:

readlink -f "$0"
8
ответ дан 29 November 2019 в 03:48
поделиться

Это тоже работает, хотя не дает «истинного» пути, если это ссылка. Это проще, но менее точно.

SCRIPT_PATH="$(whence ${0})"
1
ответ дан 29 November 2019 в 03:48
поделиться

Попробуйте выбрать команду.

which scriptname

даст вам полное квалифицированное имя сценария вместе с его абсолютным путем

1
ответ дан 29 November 2019 в 03:48
поделиться

readlink -f было бы лучше всего, если бы он был переносимым, потому что он разрешает все ссылки, найденные как для каталогов, так и для файлов.

В mac os x нет readlink -f (кроме, может быть, через macports), поэтому вы можете использовать только readlink , чтобы получить место назначения определенного файла символической ссылки.

Техника $ (cd -P ... pwd -P) хороша, но работает только для разрешения ссылок для каталогов, ведущих к сценарию, она не работает, если сам сценарий является символической ссылкой.

Также есть один случай, о котором не упоминалось: когда вы запускаете сценарий, передавая его в качестве аргумента оболочке ( / bin / sh /path/to/myscript.sh), $ 0 не может использоваться в этом случае

Я взглянул на "двоичные файлы" mysql, многие из них на самом деле являются сценариями оболочки; и теперь я понимаю, почему они просят опцию на основе или должны запускаться из определенного рабочего каталога; это потому, что нет хорошего решения для поиска целевого скрипта

2
ответ дан 29 November 2019 в 03:48
поделиться

Попробуйте использовать это:

dir = $(dirname $0)
-1
ответ дан 29 November 2019 в 03:48
поделиться

Вот что я сделал:

if [[ $0 != "/"* ]]; then
  DIR=`pwd`/`dirname $0`
else
  DIR=`dirname $0`
fi
2
ответ дан 29 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

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