1

Попытка создать скрипт bash (для Mac), который создает папку, затем запускает в этой папке несколько скриптов. Я хочу указать абсолютный путь к папке и предложить пользователю подтвердить, прежде чем предпринимать какие-либо действия.

Сценарий принимает относительный путь в качестве аргумента. Как преобразовать в абсолютный путь перед созданием папки?

!/bin/bash
if [[ $# -eq 0 ]] ; then
  echo 'Whoa! You dont want to do that! you need to tell me where to put it'
  exit 0
fi

ORG_DIR=$(pwd)
#here I want to get path before making directory, I've only figured out how to do after.
mkdir ../$1
cd ../$1
NEW_DIR=$(pwd)

echo "Running scripts in"
echo $NEW_DIR
read -p "Are you sure? (y/n) " -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
   # run a bunch of scripts
fi

Как я могу получить абсолютный путь NEW_DIR, прежде чем сделать это?

Примечание: Платформа OSX, мне не нужно поддерживать другие варианты nix.

РЕДАКТИРОВАТЬ: сб, 29

Я осознал, что, стремясь урезать вопрос только до существенных деталей, я сильно урезал свои извинения.

Этот скрипт существует в (например, ради)

/Documents/git/ProjectGenerator

Я намерен сценарий для создания проекта (или любой путь введен)

/Documents/git/NewProject

Он запускает комбинацию сценариев npm и копирует файлы из

/Documents/git/ProjectGenerator

Остальная часть сценария теперь работает нормально, однако недавно я случайно нажал Enter на неправильном каталоге. Поскольку этот сценарий предназначен только для моего использования (а не для sudo), я пытаюсь добавить проверку работоспособности, а не проверку безопасности в начале сценария. Необходимо набрать Y и войти, посмотрев на каталог.

Я пытаюсь получить абсолютный путь, и то, что я получаю, это

/Documents/git/ProjectGenerator/../NewProject

Я пытаюсь заставить его повторить

/Documents/git/NewProject

до создания каталога. (иногда путь гораздо сложнее)

В узле у нас есть path.resolve(path) В php или c его realpath(path)

Я не могу найти эквивалентную команду в OSX Bash, есть ли? или мне нужно разобрать строку?

2 ответа2

2

Вы хотите перейти к предыдущему каталогу с помощью .. и это вызывает проблемы с поиском абсолютного пути к вашему новому каталогу (в вашем скрипте с именем $1 , я назову его $new_directory_name здесь), который будет ../$new_directory_name .

Перед выполнением любого cd или mkdir я бы использовал команду basename чтобы показать абсолютный путь к исходному каталогу ($PWD ), а затем добавил к нему $new_directory_name , например:

echo $(dirname $PWD)/$new_directory_name

(или замените подстановку команд $(...) на обратные символы `...` (иногда они отображаются на stackexchange - см. раздел «Подстановка команд» в man bash

Я полагаю, что вы могли бы просто использовать расширение параметров bash (также в man bash) на $PWD вместо basename например так:

 echo ${PWD%/*}/$new_directory_name

Примеры

$ new_directory_name=newdir
$ pwd
/tmp/testdir
$ echo ${PWD%/*}/$new_directory_name
/tmp/newdir
$ echo $(dirname $PWD)/$new_directory_name
/tmp/newdir

Как упоминает user912264, вы можете проверить, является ли .. каталог с возможностью записи (с stat -c %a или %A), или, если вы уже в / cd .. никуда не денется, или просто посмотрите ошибки от mkdir , вроде

mkdir ... || { echo mkdir ERROR exiting; exit; }
1

Из этого комментария о переполнении стека https://stackoverflow.com/questions/284662/how-do-you-normalize-a-file-path-in-bash#comment81662652_284671

Я пришел к выводу, что у coreutils (который я уже установил) есть команда greadlink которая обладает необходимой мне функциональностью.

NEW_DIR=$(greadlink -f ../$1)

РЕДАКТИРОВАТЬ 1:

#!/bin/bash
if [[ $# -eq 0 ]] ; then
  #simple check to ensure enter was not accidently pressed without directory specified
  echo 'Whoa! You dont want to do that! you need to tell me where to put it';
  exit 0
fi

ORG_DIR=$(pwd)
#here I want to get path before making directory, I've only figured out how to do after.
NEW_DIR=$(greadlink -f ../$1)

echo "Running scripts in"
echo $NEW_DIR
read -p "Are you sure? (y/n) " -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]
then

  cp -r $ORG_DIR/skeleton $NEW_DIR

  cd $NEW_DIR

  #init the project with default answers.
  yarn init -y

  #add dev scripts
  yarn add --dev webpack webpack-cli babel-loader @babel/preset-react @babel/core @babel/preset-env webpack-dev-server css-loader sass-loader node-sass style-loader file-loader url-loader redux-devtools eslint eslint-plugin-react babel-eslint

  #add production scripts
  yarn add react react-dom react-hot-loader react-redux redux redux-saga redux-socket.io socket.io

fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .