11

私がやろうとしていること

$PATH に追加したシェルスクリプトを作成しました。これをダウンロードして、新しいLaravelプロジェクトのすべてをセットアップします。ターミナル ディレクトリを新しいプロジェクト フォルダに変更して、スクリプトを終了させたいと思います。

現在私が理解していることから、スクリプトが実際に実行されているサブシェルのディレクトリを変更するだけです。これを行う方法がわかりません。どんな助けでも大歓迎です。ありがとうございました!

#! /usr/bin/env bash

echo -e '\033[1;30m=========================================='

## check for a directory
if test -z "$1"; then
  echo -e ' \033[0;31m✖ Please provide a directory name'
  exit
fi

## check if directory already exist
if [ ! -d $1 ]; then
  mkdir $1
else
  echo -e ' \033[0;31m✖ The '"$1"' directory already exists'
  exit
fi

# move to directory
cd $1

## Download Laravel
echo -e ' \033[0;32m+ \033[0mDownloading Laravel...'
curl -s -L https://github.com/laravel/laravel/zipball/master > laravel.zip

## Unzip, move, and clean up Laravel
echo -e ' \033[0;32m+ \033[0mUnzipping and cleaning up files...'
unzip -q laravel.zip
rm laravel.zip
cd *-laravel-*
mv * ..
cd ..
rm -R *-laravel-*

## Make the /storage directory writable
echo -e ' \033[0;32m+ \033[0mMaking /storage directory writable...'
chmod -R o+w storage

## Download and install the Generators
echo -e ' \033[0;32m+ \033[0mInstalling Generators...'
curl -s -L https://raw.github.com/JeffreyWay/Laravel-Generator/master/generate.php > application/tasks/generate.php

## Update the application key
echo -e ' \033[0;32m+ \033[0mUpdating Application Key...'
MD5=`date +”%N” | md5`
sed -ie 's/YourSecretKeyGoesHere!/'"$MD5"'/' application/config/application.php
rm application/config/application.phpe

## Create .gitignore and initial git if -git is passed
if [ "$2" == "-git" ]; then
  echo -e ' \033[0;32m+ \033[0mInitiating git...'
  touch .gitignore
  curl -s -L https://raw.github.com/gist/4223565/be9f8e85f74a92c95e615ad1649c8d773e908036/.gitignore > .gitignore

  # Create a local git repo
  git init --quiet
  git add * .gitignore
  git commit -m 'Initial commit.' --quiet
fi

echo -e '\033[1;30m=========================================='
echo -e ' \033[0;32m✔ Laravel Setup Complete\033[0m'

## Change parent shell directory to new directory
## Currently it's only changing in the sub shell
filepath=`pwd`
cd "$filepath"
4

5 に答える 5

9

技術的sourceには、サブシェルを生成して実行する代わりに、スクリプトを親シェルで実行できます。このようにして、現在のシェルに加えた変更 (ディレクトリの変更を含む) が保持されます。

source /path/to/my/script/script

また

. /path/to/my/script/script

ただし、調達には独自の危険性があるため、慎重に使用してください。

(周辺関連:スクリプトを使用してディレクトリを変更する方法)

于 2012-12-06T21:53:34.973 に答える
6

シェル関数を使用してスクリプトをフロントエンドします

setup () {
  # first, call your big script.
  # (It could be open-coded here but that might be a bit ugly.)

  # then finally...

  cd someplace
}

シェル関数をシェル起動ファイルに入れます。

于 2012-12-06T22:29:46.290 に答える
3

子プロセス (シェルを含む) は、親プロセスの現在のディレクトリを変更できません。典型的な解決策は、親シェルで eval を使用することです。親シェルで実行するシェル スクリプトの echo コマンドでは、次のようにします。

echo "cd $filepath"

親シェルでは、シェル スクリプトを eval でキックできます。

eval `sh foo.sh`

すべての標準出力はシェル コマンドとして実行されることに注意してください。メッセージは標準エラーに出力されます:

echo "Some messages" >&2
command ... >&2
于 2012-12-06T22:14:04.693 に答える
1

これはできません。execスクリプト インタープリターを置き換えて、適切なディレクトリで新しいシェルを開くために使用します。

exec bash
于 2012-12-06T21:45:42.887 に答える
1

1つの可能性は、スクリプトの唯一の出力が最終的に行きたいパス名であることを確認してから、次のことを行うことだと思います。

cd `/path/to/my/script`

スクリプトが親シェルの環境 (現在のディレクトリを含む) に直接影響を与える方法はありませんが、これは親シェル自体がスクリプトの出力に基づいてディレクトリを変更することを要求します...

于 2012-12-06T22:12:59.187 に答える