Как правильно сделать обработку пути надежной в программе bash? - PullRequest
1 голос
/ 08 октября 2009
  • В скрипте есть несколько жестко заданных относительных путей. Я хотел бы, чтобы они были относительно позиции скрипта.

  • Сценарий должен изменить текущий каталог, как это требуется какой-то другой программе (cmake).

  • Сценарий принимает некоторые (возможно, относящиеся к вызывающему) пути в качестве аргумента и передает их в эту программу, они должны быть дереактивированы.

Вопросы встроены:

#!/bin/sh

# First arg should be Release or Debug    
# TODO test for that.

if test -n "$1"; then          # BTW how to test whether $1 is Debug or Release?
  BUILD_TYPE="$1"
else
  BUILD_TYPE="Release"
fi

# Set install prefix to current directory, unless second argument is given. 

if test -n "$2"; then
  INSTALL_PREFIX="$2"    # How to derelativize this path argument?
else
  INSTALL_PREFIX=bin     # How to make this path relative to script location?
fi

# Make build directory and do cmake, make, make install.

mkdir -p build/${BUILD_TYPE} && # How to make this path relative to script location?
cd build/${BUILD_TYPE} &&

cmake -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \
      -D CMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \ # Possible relative to caller current directory. 
      ../../ &&             # Relative to scrip position.
make -j4 &&
make install

Это общая проблема или я делаю что-то нестандартным образом?

Ответы [ 2 ]

1 голос
/ 08 октября 2009

В дополнение к тому, что сказал Дуглас Лидер , я бы рекомендовал всегда заключать переменные в двойные кавычки, чтобы пути с пробелами не испортили ваш скрипт.

1 голос
/ 08 октября 2009

1)

test $1 == "Debug"

2) Положить

SCRIPT_DIR="$(dirname $0)"
ORIGINAL_DIR="$(pwd)"

вверху скрипта (первая строка без комментариев после #! строки)

Чтобы сделать переменную абсолютной относительно скрипта:

[ "${VAR/#\//}" != "$VAR" ] || VAR="$SCRIPT_DIR/$VAR"

Чтобы сделать его относительно начального каталога:

[ "${VAR/#\//}" != "$VAR" ] || VAR="$ORIGINAL_DIR/$VAR"

Обычно мы заменяем начальную косую черту на пустую "${VAR/#\//}" и сравниваем с "$VAR", если они отличаются, то $VAR является абсолютным В противном случае мы добавляем каталог, который хотим сделать абсолютным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...