Bash脚本更改父shell目录

时间:2012-12-06 21:43:26

标签: bash shell unix cd

我正在尝试做什么

我已经创建了一个shell脚本,我已添加到我的$ PATH中,它将下载并获取新Laravel项目的所有设置。我希望通过将终端目录更改为新项目文件夹来结束脚本。

根据我现在的理解,目前只更改脚本实际运行的子shell的目录。我似乎无法弄清楚如何做到这一点。任何帮助表示赞赏。谢谢!

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

5 个答案:

答案 0 :(得分:6)

您可以从技术上source在您的父shell中运行它,而不是生成子shell来运行它。这样,您对当前shell(包括更改目录)所做的任何更改都会保留。

source /path/to/my/script/script

. /path/to/my/script/script

但是采购有其自身的危险,请谨慎使用。

(外围相关:如何use scripts to change directories

答案 1 :(得分:5)

使用shell 功能来预读脚本

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

  # then finally...

  cd someplace
}

将shell函数放在shell启动文件中。

答案 2 :(得分:3)

子进程(包括shell)无法更改父进程的当前目录。典型的解决方案是在父shell中使用eval。在shell脚本echo命令中,您希望由父shell运行:

echo "cd $filepath"

在父shell中,您可以使用eval:

踢shell脚本
eval `sh foo.sh`

请注意,所有标准输出都将作为shell命令执行。消息应输出为标准错误:

echo "Some messages" >&2
command ... >&2

答案 3 :(得分:1)

我想一种可能性是确保脚本的唯一输出是你想要结束的路径名,然后执行:

cd `/path/to/my/script`

您的脚本无法直接影响其父shell的环境(包括它的当前目录),但这会请求父shell本身根据脚本的输出更改目录...

答案 4 :(得分:0)

这不可能。使用exec在相应的目录中打开一个新shell,替换脚本解释器。

exec bash