Obtenha um caminho absoluto para uma pasta que ainda não existe [bash]

1

Tentando criar um script bash (no mac) que cria uma pasta, ele executa vários scripts nessa pasta. Eu quero ecoar o caminho absoluto para a pasta e solicitar ao usuário para confirmar antes de tomar medidas.

O script usa um caminho relativo como argumento, como faço para converter em um caminho absoluto antes de criar a pasta?

!/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

Como obtenho o caminho absoluto de NEW_DIR antes de criá-lo?

Nota: A plataforma é OSX, não preciso de suportar outras variantes 'nix'.

EDIT: sábado, 29

Percebi que, em um esforço para reduzir a questão apenas a detalhes essenciais, reduzi muito minhas desculpas.

Este script existe em (por exemplo, sake)

/Documents/git/ProjectGenerator

Pretendo que o script gere um projeto em (ou seja qual for o caminho digitado)

/Documents/git/NewProject

Ele executa uma combinação de scripts npm e copia arquivos de

/Documents/git/ProjectGenerator

O restante do script funciona bem agora, no entanto, recentemente, acidentalmente, pressionei enter no diretório errado. Como esse script é destinado apenas ao meu uso (e não ao sudo), estou tentando adicionar uma verificação de integridade, não uma verificação de segurança para o início do script. Deve digitar Y e entrar depois de examinar o diretório.

Estou tentando obter um caminho absoluto e o que estou recebendo é

/Documents/git/ProjectGenerator/../NewProject

Estou tentando fazer com que ele ecoe

/Documents/git/NewProject

antes de criar o diretório. (às vezes o caminho é muito mais complexo)

No nó, temos path.resolve(path) Em php ou c, seu realpath(path)

Eu não consigo encontrar um comando equivalente no osx bash, existe algum? ou eu preciso analisar a string?

    
por Philippe 27.09.2018 / 02:41

2 respostas

1

A partir deste comentário no estouro de pilha link

Eu cheguei à conclusão que o coreutils (que eu já tinha instalado) tem o comando greadlink que tem a funcionalidade que eu preciso.

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

EDIT 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
    
por 29.09.2018 / 23:51
2

Você deseja mudar para o diretório anterior com .. e isso está causando problemas para descobrir o caminho absoluto do novo diretório (chamado $1 no seu script, eu o chamarei $new_directory_name here) que será ../$new_directory_name .

Antes de fazer qualquer cd ou mkdir , usaria o comando basename para mostrar o caminho absoluto do diretório original ( $PWD ) e, em seguida, anexar $new_directory_name a ele, desta forma:

echo $(dirname $PWD)/$new_directory_name

(ou substitua a substituição do comando $(...) por backticks '...' (eles são exibidos em stackexchange às vezes - veja a seção Substituição de Comando de man bash

Eu acredito que você poderia simplesmente usar a Expansão de Parâmetros do bash (também em man bash ) em $PWD em vez de basename assim:

 echo ${PWD%/*}/$new_directory_name

Exemplos

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

Assim como o user912264 menciona, você pode considerar verificar se .. é um diretório gravável (com stat -c %a ou %A ) ou se você já está em / , então cd .. não vai a lugar algum novo ou apenas observe os erros de mkdir , como

mkdir ... || { echo mkdir ERROR exiting; exit; }
    
por 27.09.2018 / 04:22

Tags